进程池:
concurrent.futures.process.ProcessPoolExecutor
"""
进程之间如何实现数据共享
进程池数据共享的队列:multiprocessing.Manager().Queue()
如果要使用Pool创建进程,就需要使用multiprocessing.Manager()中的Queue(),而不是multiprocessing.Queue(),否则会得到错误信息
多线程通信的队列:queue.Queue(在同一个进程中实现数据共享)
多进程通信的队列:multiprocessing.Queue(在多个进程中实现数据共享)
进程池数据共享的队列:multiprocessing.Manager().Queue()(在进程池中实现数据共享)
"""
def work(q):
while True:
time.sleep(1)
try:
print('处理数据', q.get_nowait())
except:
return
def main():
# 进程池数据共享的专属队列
q = Manager().Queue()
for i in range(100):
q.put('数据{}'.format(i))
with ProcessPoolExecutor(max_workers=10) as tp:
for i in range(10):
tp.submit(work, q)
线程池:
concurrent.futures.thread.ThreadPoolExecutor
def add_data():
"""生产数据"""
for i in range(5):
for j in range(20):
data = "数据--{}---{}".format(i, j)
q.put(data)
# print("【生产数据】{}".format(data))
time.sleep(1)
def handle_data():
"""处理数据"""
while True:
for i in range(4):
try:
data = q.get(timeout=1)
except:
return
else:
print("【处理数据】", data)
q.task_done()
time.sleep(1)
def main():
# 实例化一个线程池对象,max_workers设置最大的线程数
# with ThreadPoolExecutor(max_workers=4) as tp:
# tp.submit(add_data)
# for i in range(3):
# tp.submit(handle_data)
tp = ThreadPoolExecutor(max_workers=4)
tp.submit(add_data)
for i in range(3):
tp.submit(handle_data)
tp.shutdown(wait=True)
def main():
li = ['data{}'.format(i) for i in range(100)]
with ThreadPoolExecutor(max_workers=10) as tp:
# for i in li:
# tp.submit(work, i)
tp.map(work, li)
"""
线程池ThreadPoolExecutor
初始化参数:
max_workers:设置最大的线程数
线程池对象的方法:
submit():往线程池中提交任务
map():批量提交任务的
参数1:任务函数
参数2:可迭代对象
shutdown():等待线程池中所有的任务执行完
"""