文章目录
- python并发编程之多线程(二)
-
- condition
- event
- queue
python并发编程之多线程(二)
上一篇介绍了,threading 模块的主核心设计 Thread, Semaphore, Lock/Rlook
这一篇将介绍多线程的condition ,event,queue, 及其应用场景
condition
一个线程等待特定条件,另一个线程的发送特定条件 ,这进condition就可以派上用场,用生产/消费模式示例
import threading
import time
def consumer(cond):
t = threading.currentThread()
with cond:
cond.wait()
print('已经接受到特定条件,执行{}'.format(t.name))
def producer(cond):
t = threading.currentThread()
with cond:
print('{}生产特定条件'.format(t.name))
cond.notify()
cond = threading.Condition()
c1 = threading.Thread(name='c1', target=consumer, args=[cond, ])
c2 = threading.Thread(name='c2', target=consumer, args=[cond, ])
c1.start()
c2.start()
for _ in range(len(cond._waiters)):
p = threading.Thread(name='p', target=producer, args=[cond, ])
p.start()
time.sleep(2)
cond._waiters: 表示消费者数wait()
执行结果:
event
condition 是一个线程等待,一个线程创造条件,event 是一个线程发送请求,一个处理
也用生产消费者模式来说明一下
```python
import threading
import time
from random import randint
def consumer(event, l):
t = threading.currentThread()
while 1:
try:
integer = l.pop()
print('{}poped by {}'.format(integer, t.name))
event.clear()
time.sleep(0.001)
except IndexError:
pass
def producer(event, l):
t = threading.currentThread()
while 1:
integer = randint(1, 10)
l.append(integer)
print('{}append by {}'.format(integer, t.name))
event.set()
time.sleep(2)
e = threading.Event()
threads = []
l = []
for c in ['c1', 'c2', 'c3']:
t = threading.Thread(name=c, target=consumer, args=[e, l])
t.start()
threads.append(t)
t = threading.Thread(name='p',target=producer, args=[e,l])
threads.append(t)
t.start()
for t in threads:
t.join()
producer 生产结果随机分配给consumer 处理:
结果:
queue
在使用queue的时候我们往往要用到多线程,一个线程往队列里放任务,一个线程处理队列中的任务
我们用一个最简单的队列架构说明一下
import threading
import queue
import time
from random import randint
def fibs(n):
if n == 1:
return 1
if n == 2:
return 2
return fibs(n - 1) + fibs(n - 2)
q = queue.Queue()
def task_create():
while 1:
time.sleep(0.1)
n = randint(1, 10)
print('生成任务{}({})'.format(fibs.__name__, n))
q.put((fibs, n))
def task_execute():
while 1:
fun, args = q.get()
print('结果:{}'.format(fun(args)))
for f in [task_create,task_execute]:
t = threading.Thread(target=f)
t.start()
结果:
关于queue 我们主要要了解以下方法
- put: 向队列中添加一个项。
- get: 从队列中删除并返回一个项。
- task_done: 当某一项任务完成时调用。
- join: 阻塞直到所有的项目都被处理完。
以及以带有优先及的队列PriorityQueue 与先进后出的队列LifoQueue
end!!!