系列文章目录
- 通过队列完成进程间的通信,实现数据共享
- 进程池Pool
一、通过队列完成进程间的通信,实现数据共享
·socket是进程间通信的一种
下面介绍一下Queue队列,传输的信息是先进先出,例如:传进去的信息是 A B ,则拿出来的顺序也是A B
核心点就是在多个进程之间打通了一个通道
放数据是用 put(需要放的数据)
取数据是用 get()
操作:

代码:
import multiprocessing
def downloud_from_web(q):
# 模拟从网上下载的数据
data = [11, 22, 33]
# 向队列中写入数据
for temp in data:
q.put(temp)
print("下载器已经下载完成了数据并存入到队列中")
def analysis_data(q):
# 模拟数据处理,从队列获取数据
waitting_analysis_data = list()
while True:
data = q.get()
waitting_analysis_data.append(data)
if q.empty():
break
print(waitting_analysis_data)
def main():
# 1.创建一个队列
q = multiprocessing.Queue()
# 2.创建多个进程,将队列的引用当做实参进行传递到里面
p1 = multiprocessing.Process(target=downloud_from_web, args=(q,))
p2 = multiprocessing.Process(target=analysis_data, args=(q,))
p1.start()
p2.start()
if __name__ == "__main__":
main()
输出结果:

二、进程池Pool
当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态生成多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时可以用到multiprocessing模块提供的Pool方法
初始化Pool时,可以指定一个最大的进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程来执行该请求,但如果池中进程数已经达到指定的最大值,那么该请求就会等待,直到池中有新的进程结束,才会用之前的进程来执行新的任务
下面是进程池的创建:

代码:
# -+- coding:utf-8 -+-
from multiprocessing import Pool
import os, time, random
def worker(msg):
t_start = time.time()
print("%s开始执行,进程号为%d" % (msg, os.getpid()))
# random.random()随机生成0-1之间的浮点数
time.sleep(random.random()*2)
t_stop = time.time()
print(msg, "执行完毕,耗时%0.2f" % (t_stop-t_start))
def main():
# 定义一个进程池,最大进程数3
p = Pool(3)
for i in range(0, 10):
# Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))
# 每次循环将会用空闲出来的子进程去调用目标
p.apply_async(worker, (i,))
print("---start---")
p.close() # 关闭进程池,关闭后p不再接收新的请求
p.join() #等待p 中所有的子进程执行完成,必须放在close后面
print("---end___")
if __name__ == "__main__":
main()
输出结果:

1437



被折叠的 条评论
为什么被折叠?



