先上个例子:
from multiprocessing import Processimport osprint("此处代码的执行情况")def run1():print(str(os.getpid()))def run2():print(str(os.getpid()))if __name__=='__main__':p1 = Process(target=run1,args=())#注意args是一个元组p2 = Process(target=run2, args=())p1.start()# 立马执行p1, 权限高于主进程,执行完才会执行其他的进程# p1.join()p2.start()print('我是进程' + str(os.getpid()))#结果:我是进程10580我是进程10580我是进程1498014980我是进程1238812388解释:print("此处代码的执行情况") 有多少进程就执行多少遍,
主进程与子进程的先后顺序
from multiprocessing import Processdef run():for i in range(1,100000001):print("子进程-----%d" % i)if __name__== "__main__":p=Process(target=run,args=())p.start()for i in range(1,100000001):print("父进程-----%d" % i)

tips:1.不要认为主进程执行完才执行子进程
2.p.start(),执行了这句代码,p进程就开始抢夺资源了
进程间的通信
import timefrom multiprocessing import Process,Queue,Managerdef A(q):while 1:try:num = q.get_nowait()print('我是进程A,取出数字:%d'%num)time.sleep(1)except :breakdef B(q):while 1:try:num = q.get_nowait()print('我是进程B,取出数字:%d'%num)time.sleep(1)except :breakif __name__=='__main__':q = Queue() # 创建列队,不传数字表示列队不限数量# q = Manager().Queue()如果使用进程池pool时,需要用q = Manager().Queue()for i in range(11):q.put(i)p1 = Process(target = A,args=(q,))p2 = Process(target = B,args=(q,))p1.start()p2.start()
Queue使用方法:
- Queue.qsize():返回当前队列包含的消息数量;
- Queue.empty():如果队列为空,返回True,反之False ;
- Queue.full():如果队列满了,返回True,反之False;
- Queue.get():获取队列中的一条消息,然后将其从列队中移除,可传参超时时长。
- Queue.get_nowait():相当Queue.get(False),取不到值时触发异常:Empty;
- Queue.put():将一个值添加进数列,可传参超时时长。
- Queue.put_nowait():相当于Queue.get(False),当队列满了时报错:Full。
进程池(更推荐ProcessPoolExcutor)
```python from multiprocessing import Process,Pool import os import time def run(i): print(“我是子进程%d” % i+”——-“+str(os.getpid())) time.sleep(2) print(“进程结束”)
if name==”main“: pool=Pool()#默认为4进程 i=[1,2,3,4,5,6,7,8,9,10] pool.map(run,i) pool.close() pool.join()
<a name="Wsj7c"></a>##<a name="tYSqK"></a>## 陷阱<a name="YqMnx"></a>#### 一个文件只有一个进程```python正确:def run():print(num)if __name__=='__main__':num=1run()
一个文件只有多个进程
错误:from multiprocessing import Processdef run1():print(num)def run2():print(num)if __name__=='__main__':num=2#这里的num不能被子进程拿到p1 = Process(target=run1, args=())p2 = Process(target=run2, args=())p1.start()p2.start()正确:from multiprocessing import Processnum = 2def run1():print(num)def run2():print(num)if __name__=='__main__':p1 = Process(target=run1, args=())p2 = Process(target=run2, args=())p1.start()p2.start()
