在学习之前你应该先了解锁和队列基础

import queue
import time
import random
import threading
import asyncio
import logging
# from queue import Empty
logging.basicConfig(level = logging.INFO,format = '%(asctime)s - %(levelname)s -->%(funcName)s at line %(lineno)d: \n %(message)s')
log= logging.getLogger()
# queue.qsize 不可以限制,作为应答式condition
q_init = queue.Queue(5) async def jobs(item):
time.sleep(random.randint(1,3))
status = random.randint(0, 1)
if status == 0:
return ("success",item)
else:
return ("failed",item) async def do_work(item):
logging.info("do something %s,time start %s" % (item, time.asctime()))
a =await jobs(item)
return a def async_runner(checker):
new_loop = asyncio.new_event_loop()
asyncio.set_event_loop(new_loop)
loop = asyncio.get_event_loop()
task = asyncio.ensure_future(do_work(checker))
loop.run_until_complete(asyncio.wait([task]))
st = task.result()
return st def worker_consumer(q_init,cond):
while True:
if q_init.empty():
break
if cond.acquire():
if not q_init.empty():
cond.notify()
checker = q_init.get()
st = async_runner(checker)
if st[0] in ["success", "failed"]:
logging.info("%s task finished status is %s" % (st[1], st[0]))
logging.info("报告大王刚摘的%s个蟠桃已经吃完了..." % checker)
q_init.task_done()
cond.release() def producer(cond,q_init):
item = 1
while True:
if cond.acquire():
if q_init.qsize() <5:
q_init.put(item)
logging.info("孩儿们,刚从蟠桃园摘了%s 个蟠桃给你们尝尝..." % item)
cond.notify()
else:
cond.wait()
cond.release()
item += 1
if item >= 11:
break
q_init.join() if __name__ == '__main__':
# 消费者>生产者
thread_num=5
cond=threading.Condition()
producer = [threading.Thread(target=producer,args=(cond,q_init)) for i in range(1)]
consumer = [threading.Thread(target=worker_consumer, args=(q_init,cond)) for i in range(thread_num)]
for p in producer:
p.start()
for k in consumer:
k.start()
# block main thread of producer
for pr in producer:
pr.join()
for m in consumer:
m.join()

结果:

2019-12-21 22:14:23,853  - INFO -->producer  at line 56:
孩儿们,刚从蟠桃园摘了1 个蟠桃给你们尝尝...
2019-12-21 22:14:23,853 - INFO -->producer at line 56:
孩儿们,刚从蟠桃园摘了2 个蟠桃给你们尝尝...
2019-12-21 22:14:23,853 - INFO -->producer at line 56:
孩儿们,刚从蟠桃园摘了3 个蟠桃给你们尝尝...
2019-12-21 22:14:23,853 - INFO -->producer at line 56:
孩儿们,刚从蟠桃园摘了4 个蟠桃给你们尝尝...
2019-12-21 22:14:23,853 - INFO -->producer at line 56:
孩儿们,刚从蟠桃园摘了5 个蟠桃给你们尝尝...
2019-12-21 22:14:23,854 - INFO -->do_work at line 22:
do something 1,time start Sat Dec 21 22:14:23 2019
2019-12-21 22:14:24,856 - INFO -->worker_consumer at line 45:
1 task finished status is failed
2019-12-21 22:14:24,857 - INFO -->worker_consumer at line 46:
报告大王刚摘的1个蟠桃已经吃完了...
2019-12-21 22:14:24,857 - INFO -->producer at line 56:
孩儿们,刚从蟠桃园摘了7 个蟠桃给你们尝尝...
2019-12-21 22:14:24,859 - INFO -->do_work at line 22:
do something 2,time start Sat Dec 21 22:14:24 2019
2019-12-21 22:14:27,860 - INFO -->worker_consumer at line 45:
2 task finished status is failed
2019-12-21 22:14:27,860 - INFO -->worker_consumer at line 46:
报告大王刚摘的2个蟠桃已经吃完了...
2019-12-21 22:14:27,861 - INFO -->do_work at line 22:
do something 3,time start Sat Dec 21 22:14:27 2019
2019-12-21 22:14:29,861 - INFO -->worker_consumer at line 45:
3 task finished status is success
2019-12-21 22:14:29,861 - INFO -->worker_consumer at line 46:
报告大王刚摘的3个蟠桃已经吃完了...
2019-12-21 22:14:29,862 - INFO -->do_work at line 22:
do something 4,time start Sat Dec 21 22:14:29 2019
2019-12-21 22:14:31,863 - INFO -->worker_consumer at line 45:
4 task finished status is success
2019-12-21 22:14:31,863 - INFO -->worker_consumer at line 46:
报告大王刚摘的4个蟠桃已经吃完了...
2019-12-21 22:14:31,864 - INFO -->do_work at line 22:
do something 5,time start Sat Dec 21 22:14:31 2019
2019-12-21 22:14:32,865 - INFO -->worker_consumer at line 45:
5 task finished status is failed
2019-12-21 22:14:32,865 - INFO -->worker_consumer at line 46:
报告大王刚摘的5个蟠桃已经吃完了...
2019-12-21 22:14:32,866 - INFO -->do_work at line 22:
do something 7,time start Sat Dec 21 22:14:32 2019
2019-12-21 22:14:34,867 - INFO -->worker_consumer at line 45:
7 task finished status is failed
2019-12-21 22:14:34,867 - INFO -->worker_consumer at line 46:
报告大王刚摘的7个蟠桃已经吃完了...
2019-12-21 22:14:34,867 - INFO -->producer at line 56:
孩儿们,刚从蟠桃园摘了9 个蟠桃给你们尝尝...
2019-12-21 22:14:34,867 - INFO -->producer at line 56:
孩儿们,刚从蟠桃园摘了10 个蟠桃给你们尝尝...
2019-12-21 22:14:34,868 - INFO -->do_work at line 22:
do something 9,time start Sat Dec 21 22:14:34 2019
2019-12-21 22:14:37,869 - INFO -->worker_consumer at line 45:
9 task finished status is failed
2019-12-21 22:14:37,869 - INFO -->worker_consumer at line 46:
报告大王刚摘的9个蟠桃已经吃完了...
2019-12-21 22:14:37,870 - INFO -->do_work at line 22:
do something 10,time start Sat Dec 21 22:14:37 2019
2019-12-21 22:14:38,871 - INFO -->worker_consumer at line 45:
10 task finished status is failed
2019-12-21 22:14:38,871 - INFO -->worker_consumer at line 46:
报告大王刚摘的10个蟠桃已经吃完了...

  


条件锁condition与Queue()的更多相关文章

  1. 条件锁Condition

    """设计场景:timo先说一句,亚索再说一句timo: timo队长正在待命yasuo: 面对疾风吧timo: timo整装待发yasuo: 哈杀gay "& ...

  2. 死磕 java同步系列之ReentrantLock源码解析(二)——条件锁

    问题 (1)条件锁是什么? (2)条件锁适用于什么场景? (3)条件锁的await()是在其它线程signal()的时候唤醒的吗? 简介 条件锁,是指在获取锁之后发现当前业务场景自己无法处理,而需要等 ...

  3. java并发多线程显式锁Condition条件简介分析与监视器 多线程下篇(四)

    Lock接口提供了方法Condition newCondition();用于获取对应锁的条件,可以在这个条件对象上调用监视器方法 可以理解为,原本借助于synchronized关键字以及锁对象,配备了 ...

  4. python线程condition条件锁应用实例

    import time import threading # 吃火锅鱼丸 guo = [] suo = threading.Condition() #条件锁 # 生产者负责生产 class Produ ...

  5. Python的条件锁与事件共享

    1:事件机制共享队列: 利用消息机制在两个队列中,通过传递消息,实现可以控制的生产者消费者问题要求:readthread读时,writethread不能写:writethread写时,readthre ...

  6. python线程条件变量Condition(31)

    对于线程与线程之间的交互我们在前面的文章已经介绍了 python 互斥锁Lock / python事件Event , 今天继续介绍一种线程交互方式 – 线程条件变量Condition. 一.线程条件变 ...

  7. 深入理解java:2.3.2. 并发编程concurrent包 之重入锁/读写锁/条件锁

    重入锁 Java中的重入锁(即ReentrantLock)   与JVM内置锁(即synchronized)一样,是一种排它锁. ReentrantLock提供了多样化的同步,比如有时间限制的同步(定 ...

  8. 关于一点pthread_cond_t条件锁的思考以及实验

    转:http://blog.csdn.net/aniao/article/details/5802015 APUE上,关于条件锁.其中有这么几条总结: 1.使用条件锁前必须先锁住对应的互斥锁. 2.条 ...

  9. Linux 开发之线程条件锁那些事

    2019独角兽企业重金招聘Python工程师标准>>> 条件锁即在一定条件下触发,那什么时候适合用条件锁呢,那当然是你在等待一个符合的条件下触发.一个常用的例子就是在线程中无限循环执 ...

随机推荐

  1. Arcgis runtime sdk .net 二次开发

    前段时间研究了下 arcgis runtime sdk .net 二次开发··这里做个笔记 runtime版本为100.6 基于WPF 开发 命名空间引入 xmlns:esri="http: ...

  2. SYZOJP186 你猜猜是不是DP 二分+hash解法

    SYZOJP186 你猜猜是不是DP题解 题目传送门 现在给两个仅包含小写字母的字符串a,b ,求a 与b的最长公共连续子串的长度. 对于20%的数据,a,b长度 ∈ [1, 200] 对于50%的数 ...

  3. 虚拟化技术xen的简介和安装

    虚拟化技术的分类: 1,模拟:Emulation ​ Qemu,PearPC,Bochs 2,完全虚拟化:Full Virtualization,Native Virtualization ​ HVM ...

  4. sqli-labs1-10基础掌握

    00x01基于错误的GET单引号字符型注入 首先and 1=2判断是否为数值型sql注入,页面正常,不是 然后’测试,发现页面报sql语句错误,存在字符型sql注入  猜测参数为单引号闭合,用注释语句 ...

  5. JAVA类(内部类、匿名内部类、异常、自定义异常)

    内部类 package AA; public class 类 { ; StringBuffer dee=new StringBuffer(); public class 成员内部类{ public v ...

  6. bootstrap资料索引

    中文手册  :  http://w3c.3306.biz/bootstrap_forms/show-25-64-1.html

  7. pandas模块详解

    Pandas模块 1.什么是pandas pandas是基于numpy构建的,用来做数据分析的 2.pandas能干什么 具备对其功能的数据结构DataFrame,Series 集成时间序列功能 提供 ...

  8. qml-main.cpp中的两种启动Qt Quick App模式

     现有两种启动Qt Quick App 模式: QQmlApplicationEngine搭配Window. QQuickView搭配Item.  qt默认使用第一种方法. QQmlApplicati ...

  9. jQuery实现TAB选项卡切换特效简单演示

    本文实例为大家分享jQuery实现TAB选项卡切换特效,供大家参考,具体内容如下 1.tab切换 on ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1 ...

  10. python3爬取电影数据

    爬取电影票房数据,用于统计建模分析.目标网站为电影票房数据库(http://58921.com/alltime). 基本的爬取静态网站的技术,模拟登陆使用的是最简单的cookies.(这种模拟登陆的方 ...