先上个例子:

  1. from multiprocessing import Process
  2. import os
  3. print("此处代码的执行情况")
  4. def run1():
  5. print(str(os.getpid()))
  6. def run2():
  7. print(str(os.getpid()))
  8. if __name__=='__main__':
  9. p1 = Process(target=run1,args=())#注意args是一个元组
  10. p2 = Process(target=run2, args=())
  11. p1.start()
  12. # 立马执行p1, 权限高于主进程,执行完才会执行其他的进程
  13. # p1.join()
  14. p2.start()
  15. print('我是进程' + str(os.getpid()))
  16. #结果:
  17. 我是进程10580
  18. 我是进程10580
  19. 我是进程14980
  20. 14980
  21. 我是进程12388
  22. 12388
  23. 解释:print("此处代码的执行情况") 有多少进程就执行多少遍,

主进程与子进程的先后顺序

  1. from multiprocessing import Process
  2. def run():
  3. for i in range(1,100000001):
  4. print("子进程-----%d" % i)
  5. if __name__== "__main__":
  6. p=Process(target=run,args=())
  7. p.start()
  8. for i in range(1,100000001):
  9. print("父进程-----%d" % i)

进程 - 图1
tips:1.不要认为主进程执行完才执行子进程
2.p.start(),执行了这句代码,p进程就开始抢夺资源了

进程间的通信

  1. import time
  2. from multiprocessing import Process,Queue,Manager
  3. def A(q):
  4. while 1:
  5. try:
  6. num = q.get_nowait()
  7. print('我是进程A,取出数字:%d'%num)
  8. time.sleep(1)
  9. except :
  10. break
  11. def B(q):
  12. while 1:
  13. try:
  14. num = q.get_nowait()
  15. print('我是进程B,取出数字:%d'%num)
  16. time.sleep(1)
  17. except :
  18. break
  19. if __name__=='__main__':
  20. q = Queue() # 创建列队,不传数字表示列队不限数量
  21. # q = Manager().Queue()如果使用进程池pool时,需要用q = Manager().Queue()
  22. for i in range(11):
  23. q.put(i)
  24. p1 = Process(target = A,args=(q,))
  25. p2 = Process(target = B,args=(q,))
  26. p1.start()
  27. 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()

  1. <a name="Wsj7c"></a>
  2. ##
  3. <a name="tYSqK"></a>
  4. ## 陷阱
  5. <a name="YqMnx"></a>
  6. #### 一个文件只有一个进程
  7. ```python
  8. 正确:
  9. def run():
  10. print(num)
  11. if __name__=='__main__':
  12. num=1
  13. run()

一个文件只有多个进程

  1. 错误:
  2. from multiprocessing import Process
  3. def run1():
  4. print(num)
  5. def run2():
  6. print(num)
  7. if __name__=='__main__':
  8. num=2#这里的num不能被子进程拿到
  9. p1 = Process(target=run1, args=())
  10. p2 = Process(target=run2, args=())
  11. p1.start()
  12. p2.start()
  13. 正确:
  14. from multiprocessing import Process
  15. num = 2
  16. def run1():
  17. print(num)
  18. def run2():
  19. print(num)
  20. if __name__=='__main__':
  21. p1 = Process(target=run1, args=())
  22. p2 = Process(target=run2, args=())
  23. p1.start()
  24. p2.start()