python 多进程(mutiprocessing)以及进程间的通信

首先和线程进行比较

 

导入进程标准模块和线程标准模块

import multiprocessing as mp
import threading as td

定义一个被进程和线程调用的函数

def job(a,d):
    print('aaaaa')

创建进程和线程

p1 = mp.Process(target=job,args=(1,2))
t1 = td.Thread(target=job,args=(1,2))

注意:Thread和Process的首字母都要大写,被调用的函数没有括号,被调用的函数的参数放在args(…)中

分别启动进程和线程

p1.start()
t1.start()

分别连接进程和线程

p1.join()
t1.join()

完整的线程和进程创建对比代码

import multiprocessing as mp
import threading as td

def job(a,d):
    print('aaaaa')

t1 = td.Thread(target=job,args=(1,2))
p1 = mp.Process(target=job,args=(1,2))
t1.start()
p1.start()
t1.join()
p1.join()

从上面的使用对比代码可以看出,线程和进程的使用方法相似

进程的运用

在运用时需要添加上一个定义main函数的语句

import multiprocessing as mp

def job(a,d):
    print('aaaaa')

if __name__=='__main__':
    p1 = mp.Process(target=job,args=(1,2))
    p1.start()
    p1.join()

运行后打印的结果为:

aaaaa

进程间的通信

进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的。

----这是操作系统开辟的一个空间,可以让各个子进程把信息放到Queue中,也可以把自己需要的信息取走
----这就相当于系统给python开辟了一个聊天室,让python创建的子进程可以在这个聊天室里畅所欲言
----一个进程可以放多条消息到Queue中

Queue的功能是将每个核或线程的运算结果放在队里中, 等到每个线程或核运行完毕后再从队列中取出结果, 继续加载运算。原因很简单, 多线程调用的函数不能有返回值, 所以使用Queue存储多个线程运算的结果

多进程就是多核运算

创建一个多进程并且互相之间进行通信的实例如下:

import multiprocessing as mp

def job(q):
    res=0
    for i in range(1000):
        res+=i+i**2+i**3
    q.put(res)    #queue

if __name__=='__main__':
    q = mp.Queue()
    p1 = mp.Process(target=job,args=(q,))
    p2 = mp.Process(target=job,args=(q,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    res1 = q.get()
    res2 = q.get()
    print(res1+res2)

在你自己的任务中,只需要修改job函数的内容即可

注意:

当创建了多个process子进程时,创建完成后先start(),最后必须统一join,这样所有子进程才会并行执行。

q = mp.Queue()
for i in range(worknum):
    p = Process(target = job, args = (q,))
    p.start()
    proc_record.append(p)
  for p in proc_record:
    p.join()

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值