重中之重
进程池、线程池
from concurrent.futures
import ProcessPoolExecutor, ThreadPoolExecutor
import time
def task(n):
time.sleep(
2)
return n **
2
def deal_result(ret):
ret = ret.result()
print(ret)
if __name__ ==
'__main__':
p = ThreadPoolExecutor()
p_list = []
for i
in range(
10):
obj = p.submit(task, i).add_done_callback(deal_result)
p_list.append(obj)
p.shutdown()
print([i.result()
for i
in p_list])
生产者消费者模型
进程实现消费者生产者模型
from multiprocessing
import Process, JoinableQueue
import time
import multiprocessing
q = JoinableQueue()
def consumer(q):
while 1:
res = q.get()
time.sleep(
2)
print(
'消费者消费了%s' % res)
q.task_done()
def producer0(q):
for i
in range(
5):
q.put(i)
print(
'生产者生产了%s' % i)
q.join()
def producer1(q):
for i
in range(
5):
q.put(i)
print(
'生产者生产了%s' % i)
q.join()
if __name__ ==
'__main__':
p1 = Process(target=producer0, args=(q,))
p2 = Process(target=producer1, args=(q,))
p3 = Process(target=consumer, args=(q,))
p3.daemon =
True
p1.start()
p2.start()
p3.start()
p1.join()
p2.join()
线程实现生产者消费者模型
from threading
import Thread
import queue
import time
q = queue.Queue()
def consumer():
while 1:
res = q.get()
time.sleep(
2)
print(
'消费者消费了%s' % res)
q.task_done()
def producer0():
for i
in range(
5):
q.put(i)
print(
'生产者0000生产了%s' % i)
q.join()
def producer1():
for i
in range(
5):
q.put(i)
print(
'生产者1111生产了%s' % i)
q.join()
if __name__ ==
'__main__':
t1 = Thread(target=consumer,)
t2 = Thread(target=producer0,)
t3 = Thread(target=producer1,)
t1.daemon =
True
t1.start()
t2.start()
t3.start()
t2.join()
t3.join()
回调函数
任务必须要有返回值以供回调函数调用,在add_done_callback中处理数据要先在任务中调用ret.result()将数据获取到~
from concurrent.futures
import ProcessPoolExecutor, ThreadPoolExecutor
import time
def task(n):
time.sleep(
2)
return n **
2
def deal_result(ret):
ret = ret.result()
print(ret)
if __name__ ==
'__main__':
p = ThreadPoolExecutor()
p_list = []
for i
in range(
10):
obj = p.submit(task, i).add_done_callback(deal_result)
p_list.append(obj)
p.shutdown()
print([i.result()
for i
in p_list])
Queue
from multiprocessing
import Process, JoinableQueue
import time
import multiprocessing
q = JoinableQueue()
def consumer(q):
while 1:
res = q.get()
time.sleep(
2)
print(
'消费者消费了%s' % res)
q.task_done()
def producer0(q):
for i
in range(
5):
q.put(i)
print(
'生产者生产了%s' % i)
q.join()
def producer1(q):
for i
in range(
5):
q.put(i)
print(
'生产者生产了%s' % i)
q.join()
if __name__ ==
'__main__':
p1 = Process(target=producer0, args=(q,))
p2 = Process(target=producer1, args=(q,))
p3 = Process(target=consumer, args=(q,))
p3.daemon =
True
p1.start()
p2.start()
p3.start()
p1.join()
p2.join()
进程池线程池不能用Queue,如果想用,请参考下面的博客: Python3之无法在进程池中使用队列Queue的解决方案