首先和线程进行比较
导入进程标准模块和线程标准模块
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()