先上个例子:
from multiprocessing import Process
import os
print("此处代码的执行情况")
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
我是进程14980
14980
我是进程12388
12388
解释:print("此处代码的执行情况") 有多少进程就执行多少遍,
主进程与子进程的先后顺序
from multiprocessing import Process
def 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 time
from multiprocessing import Process,Queue,Manager
def A(q):
while 1:
try:
num = q.get_nowait()
print('我是进程A,取出数字:%d'%num)
time.sleep(1)
except :
break
def B(q):
while 1:
try:
num = q.get_nowait()
print('我是进程B,取出数字:%d'%num)
time.sleep(1)
except :
break
if __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=1
run()
一个文件只有多个进程
错误:
from multiprocessing import Process
def 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 Process
num = 2
def run1():
print(num)
def run2():
print(num)
if __name__=='__main__':
p1 = Process(target=run1, args=())
p2 = Process(target=run2, args=())
p1.start()
p2.start()