python—进程总结

偏执的太偏执、 2024-04-06 10:57 147阅读 0赞

在这里插入图片描述

CSDN话题挑战赛第2期
参赛话题:学习笔记


一、进程对象的方法

start:启动进程
run:负责进行执行target指定的任务函数

在这里插入图片描述

  1. from multiprocessing import Process
  2. import time
  3. def work():
  4. for i in range(6):
  5. print(f"主进程{
  6. i}工作")
  7. time.sleep(1)
  8. def work1():
  9. for i in range(5):
  10. print(f"主进程{
  11. i}学习")
  12. time.sleep(1)
  13. if __name__ == '__main__':
  14. t1=Process(target=work)
  15. t2=Process(target=work1)
  16. t1.start()
  17. t2.start()
  18. print('主进程执行完毕')
  19. for i in range(6):
  20. print('------------------------hahaha')
  21. time.sleep(1)

主进程执行完毕
-———————————-hahaha
主进程0工作
主进程0学习
-———————————-hahaha
主进程1工作
主进程1学习
-———————————-hahaha
主进程2工作
主进程2学习
-———————————-hahaha
主进程3工作
主进程3学习
-———————————-hahaha
主进程4工作
主进程4学习
-———————————-hahaha
主进程5工作

二、多个进程如何共享数据

案例一、进程与进程之间相互独立,不会改变全局变量

  1. from multiprocessing import Process
  2. import time
  3. n=0
  4. def work():
  5. global n
  6. n=1000+n
  7. print('work',n)
  8. def work1():
  9. global n
  10. n = 10000 + n
  11. print('work1', n)
  12. if __name__ == '__main__':
  13. t1 = Process(target=work)
  14. t2 = Process(target=work1)
  15. t1.start()
  16. t2.start()
  17. print('主进程执行完毕',n)

主进程执行完毕 0
work 1000
work1 10000

案例二、使用进程中得队列JoinableQueue实现

进程的创建由用户控制,进程的调度、执行、阻塞调度由操作系统控制
data=q.get(timeout=1):表示如果超过1s队列中还没有数据,处理数据的线程阻塞

  1. from multiprocessing import Process,JoinableQueue,Manager
  2. import time
  3. def work(q):
  4. for i in range(5):
  5. for j in range(20):
  6. q.put(f'生产数据{
  7. j}')
  8. print(f'【生产数据{
  9. j}】')
  10. time.sleep(1)
  11. def handle(q):
  12. while True:
  13. for i in range(4):
  14. try:
  15. data=q.get(timeout=1)
  16. except:
  17. return
  18. else:
  19. print('获取数据:',data)
  20. q.task_done()
  21. time.sleep(1)
  22. if __name__ == '__main__':
  23. que = JoinableQueue()
  24. st=time.time()
  25. t=Process(target=work,kwargs={
  26. 'q':que})
  27. t.start()
  28. thread_list=[]
  29. for i in range(3):
  30. t1=Process(target=handle,kwargs={
  31. 'q':que})
  32. t1.start()
  33. thread_list.append(t1)
  34. #todo 等待数据生产完成
  35. t.join()
  36. for t1 in thread_list:
  37. t1.join()
  38. #todo 等待队列中的数据处理完成
  39. que.join()
  40. print('主线程执行完毕')
  41. st1=time.time()
  42. print('程序执行时间:',st1-st)

1、queue模块中的队列(Queue),它只能用于单个进程中(多个线程之间的数据共享)
2、multiprocessing中的队列,专为python多进程(Process)数据共享而设计的(多个进程的数据传输)——multiprocessing.Queue()
3、multiprocessing.Manager().Queue():python中进程池通信专用的队列

三、进程池的使用

t1 = ThreadPoolExecutor(max_workers=5):创建一个线程池,线程池中最多支持同时执行多少个任务
t1.submit(`*args,
kwargs`):往线程池中提交执行的任务
t1.shutdown():等待线程池中所有的任务执行完毕之后,开始执行**

  1. from concurrent.futures.process import ProcessPoolExecutor
  2. from concurrent.futures.thread import ThreadPoolExecutor
  3. import time
  4. import threading
  5. def work(name):
  6. for i in range(6):
  7. print(f"进程1工作---{
  8. name}")
  9. time.sleep(1)
  10. def work1(name):
  11. for i in range(5):
  12. print(f"进程2学习---{
  13. name}")
  14. time.sleep(1)
  15. if __name__ == '__main__':
  16. #todo 创建一个进程池
  17. t1 = ProcessPoolExecutor(max_workers=5) # todo 进程池中最多支持同时执行多少个任务
  18. st=time.time()
  19. #todo 往进程池中提交执行的任务
  20. t1.submit(work,'kobe')
  21. t1.submit(work1,'james')
  22. #todo 等待进程池中所有的任务执行完毕之后,开始执行
  23. t1.shutdown()
  24. et=time.time()
  25. print('执行的时间:',et-st)

四、往线程池中批量提交任务

t1.map(func1,li):往线程池中批量提交任务

等价于

  1. for i in li:
  2. t1.submit(func1,i)

每遍历出一条数据,向线程池中提交一条数据

  1. from concurrent.futures.process import ProcessPoolExecutor
  2. from concurrent.futures.thread import ThreadPoolExecutor
  3. import time
  4. import threading
  5. def func1(item):
  6. for i in range(2):
  7. print('正在执行任务{},的第{}轮'.format(item,i))
  8. time.sleep(0.25)
  9. if __name__ == '__main__':
  10. #todo 创建一个进程池
  11. t1 = ProcessPoolExecutor(max_workers=3) # todo 进程池中最多支持同时执行多少个任务
  12. li=[11,6,8,24,22] #todo 用例数据
  13. #todo 批量往进程池中提交任务
  14. t1.map(func1,li)
  15. #todo 等价于
  16. # for i in li:
  17. # t1.submit(func1,i)

五、with操作线程池和进程池对象

  1. from concurrent.futures.process import ProcessPoolExecutor
  2. import time
  3. import threading
  4. def func1(item):
  5. for i in range(2):
  6. print('正在执行任务{},的第{}轮'.format(item,i))
  7. time.sleep(0.25)
  8. if __name__ == '__main__':
  9. st=time.time()
  10. with ProcessPoolExecutor(max_workers=2) as tp:
  11. tp.map(func1,[11,22,33])
  12. et=time.time()
  13. print('时长:',et-st)

六、进程间实现数据通信

q=Manager().Queue():使用进程池专用的队列进行数据传输

  1. from concurrent.futures.process import ProcessPoolExecutor
  2. from multiprocessing import Manager
  3. def work1(q):
  4. number=q.get()
  5. number = number + 100
  6. print("--------work1-----number---", number)
  7. q.put(number)
  8. def work2(q):
  9. number = q.get()
  10. number = number + 66
  11. print("--------work2-----number---", number)
  12. q.put(number)
  13. if __name__ == '__main__':
  14. number = 100
  15. #todo 使用进程池专用的队列进行数据传输
  16. q=Manager().Queue()
  17. q.put(number)
  18. with ProcessPoolExecutor(max_workers=3) as f:
  19. f.submit(work1,q)
  20. f.submit(work2,q)
  21. number=q.get()
  22. print('主进程number',number)

-———-work1——-number— 200
-———-work2——-number— 266
主进程number 266


在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,147人围观)

还没有评论,来说两句吧...

相关阅读

    相关 python进程总结

      概述 由于python中全局解释器锁(GIL)的存在,所以python多线程并不能有效利用CPU多核的性能(相当于单核并发)实现多线程多核并行,所以在对CPU密集型

    相关 孤儿进程与僵尸进程[总结]

    1、前言   之前在看《unix环境高级编程》第八章进程时候,提到孤儿进程和僵尸进程,一直对这两个概念比较模糊。今天被人问到什么是孤儿进程和僵尸进程,会带来什么问题,怎么解决

    相关 Linux进程总结

    进程 进程,是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。它的执行需要系统分配资源创建实体之后,才能进行。举个例子