多进程简单实现
Python中的多线程实现是在一个物理CPU线程内部进行切片实现的,因此并没有实现真正意义上的多线程(通过在Python多线程中写死循环然后查看CPU的占用情况就能明确该论述)。
那是不是Python语言就直接无法利用多个CPU核心线程呢?并不是,Python通过multiprocessing多进程模块实现了该功能。
代码实现也很简单,如下所示:
import multiprocessing
def worker(interval):
print(interval)
if __name__ == '__main__':
p1 = multiprocessing.Process(target=worker, args=(1,))
p2 = multiprocessing.Process(target=worker, args=(2,))
p3 = multiprocessing.Process(target=worker, args=(3,))
p4 = multiprocessing.Process(target=worker, args=(4,))
p1.start()
p2.start()
p3.start()
p4.start()
print("The number of CPU is:" + str(multiprocessing.cpu_count()))
for p in multiprocessing.active_children():
print("child p.name:" + p.name + "\tp.id" + str(p.pid))
如果进程数量很多,也可以写成这样:
import multiprocessing
def worker(interval):
print(interval)
if __name__ == '__main__':
p_list = [] #存放多进程对象的列表
# 创建多进程
for i in range(10):
p = multiprocessing.Process(target=worker, args=(i,))
p_list.append(p)
# 开启多进程
for res in p_list:
res.start()
# 等待进程结束
for res in p_list:
res.join()
多进程间共享数据
多进程实现最常见的需求在于进程之间的数据共享交互,multiprocessing模块提供了非常便捷的操作:
import multiprocessing
def worker(mdict,interval):
#打印字典中的对象
print(mdict)
mdict[interval] = {"ax": interval, "ay": interval, "yaw": interval}
if __name__ == '__main__':
mdict = multiprocessing.Manager().dict() # 生成一部字典,可以在多个进程中传递和共享数据。
p_list = [] # 存放多进程对象的列表
# 创建多进程
for i in range(10):
p = multiprocessing.Process(target=worker, args=(mdict,i,))
p_list.append(p)
# 开启多进程
for res in p_list:
res.start()
# 等待进程结束
for res in p_list:
res.join()