当前位置:   article > 正文

python多进程multiprocessing使用,看这篇就够了(一)_python multiprocessing 获取进程id

python multiprocessing 获取进程id

1. 看代码

 

 以上可看到,2个任务(子进程)同时启动,下载时间由耗时最久的任务决定。

再看看没有使用多进程的情况,下载时间是2个任务下载时间之和。

down_time变量的备注写错了,应该是2-5秒。

2.在电脑里,每个进程都是独立的,都有自己的资源、内存空间,当然都有唯一的id,打开电脑的任务管理器,可以看到,这里显示电脑正在运行的所有进程。 进程是正在运行的程序的实例。

3.多进程是怎么运行的呢,python的os包提供了getpid()方法可以打印进程id, 

4. 如果不使用join(join起到阻塞作用), 看看是什么情况: 

 5.以上可以看出join的作用了,使用join,主进程跑到join那里,处于挂起状态,看源码,join可以通过设置timeout来决定主进程等待多长时间,若子进程在timeout用完了还没跑完,主进程会杀死子进程。

6. 这里引出守护进程daemon, 将子进程用daemon设置为True, 则子进程成为主进程的守护线程,主进程死,则守护线程死。

7. 各个进程是独立的,不会共享全局变量,那么进程间如何进行进行通信呢,可以使用multiprocessing的Queue,

例如,要计算从0到1亿的和,如果不使用多进程,时间将会很长,如果使用多进程,将0到1亿分成几段,每一段使用一个进程进行计算,最后将各个进程的计算的结果相加,就能大大减少计算的时间。

  1. from multiprocessing import Process, Queue
  2. import time
  3. def add(num_list, que):
  4. total = 0
  5. for i in num_list:
  6. total += i
  7. que.put(total)
  8. def main():
  9. processes = []
  10. num_list = []
  11. index = 0
  12. for i in range(1, 11):
  13. # 将1到1亿的数字分成10个列表, 每个列表包含1千万个数字, num_list结构
  14. # [[1, 2, 3,..., 10000000], [10000001, 10000002,..., 20000000], ..., [90000001, 90000002,..., 100000000]]
  15. num_list.append([n for n in range(index, index+10000001)])
  16. index += 10000001
  17. que = Queue()
  18. for j in range(10):
  19. p = Process(target=add, args=(num_list[j], que))
  20. processes.append(p)
  21. start_time = time.time()
  22. for p in processes:
  23. p.start()
  24. for p in processes:
  25. p.join()
  26. total = 0
  27. while not que.empty():
  28. total += que.get()
  29. end_time = time.time()
  30. print(f"Total time taken: {end_time - start_time}, total: {total}")
  31. # Total time taken: 8.356080055236816, total: 5000000950000045
  32. if __name__ == '__main__':
  33. main()

 ps: 线上项目千万不要这样用列表装大量数据,服务器内存会爆炸!!!

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号