博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python并发编程02/多进程
阅读量:5263 次
发布时间:2019-06-14

本文共 6431 字,大约阅读时间需要 21 分钟。

目录

python并发编程02/多进程

1.进程创建的两种方式

1.1开启进程的第一种方式

from multiProcessing import Processimport timedef task(name):    print(f'{name} is running')    time.sleep(2)    print(f'{name} is gone')if __name__ == '__main__':    #在window环境下,开启进程必须__name=='__main__'下面    p = Process(target=task,args=('太阳',)) #创建一个进程对象    p.start() #只是向操作系统发出一个开辟子进程的信号,然后就执行下一行了#这个信号操作系统接收到之后,会从内存中开辟子进程空间,然后再将主进程所有数据copy加载到子进程,然后再调用CPU去执行.    #开辟子进程开销是很大的    print('==主开始')    time.sleep(3)    #所以永远会先执行主进程的代码

1.2开启进程的第二种方式

# from multiprocessing import Process# import time## class MyProcess(Process):##     def __init__(self,name):#         super().__init__()#         self.name = name##     def run1(self):#         print(f'{self.name} is running')#         time.sleep(2)#         print(f'{self.name} is gone')### if __name__ == '__main__':#     p = MyProcess('太阳')#     p.start()#     print('===主')

1.3简单应用

# from multiprocessing import Process# import time# # def task(name):#     print(f'{name} is running')#     time.sleep(1)#     print(f'{name} is gone')## def task1(name):#     print(f'{name} is running')#     time.sleep(2)#     print(f'{name} is gone')## def task2(name):#     print(f'{name} is running')#     time.sleep(3)#     print(f'{name} is gone')### if __name__ == '__main__':#     # 在windows环境下, 开启进程必须在 __name__ == '__main__' 下面#     # 一个进程串行的执行三个任务#     start_time = time.time()#     task('太阳')#     task1('月亮')#     task2('星星')#     print(f'结束时间{time.time() - start_time}')    # 三个进程 并发或者并行的执行三个任务    # start_time = time.time()    # p1 = Process(target=task, args=('太阳',))  # 创建一个进程对象    # p2 = Process(target=task1, args=('月亮',))# 创建一个进程对象    # p1.start()    # p2.start()    # task2('星星')    # print(f'结束时间{time.time()-start_time}')

2.进程pid

2.1命令行获取所有的进程的pid tasklist

1730001-20190820224507596-196824492.png

2.2代码级别如何获取一个进程的pid

import osprint(os.getpid())

2.3获取父进程(主进程)的pid

1730001-20190820224519499-1532658579.png

import osimport timeprint(f'子进程:{os.getpid()}')print(f'主(父)进程:{os.getppid(())}')

3.验证进程之间的空间隔离

#from multiprocessing import Process#import os#import time# name = 'dabai'## def task():#     global name#     name = 'ergou'#     print(f'子进程{name}')### if __name__ == '__main__':#     p = Process(target=task)  # 创建一个进程对象#     p.start()#     # print('==主开始')#     time.sleep(3)#     print(f'主:{name}')

4.进程对象join方法

join让主进程等待子进程结束后,再执行主进程# from multiprocessing import Process# import time## def task(name):#     print(f'{name} is running')#     time.sleep(2)#     print(f'{name} is gone')#### if __name__ == '__main__':##     p = Process(target=task,args=('太阳',))  # 创建一个进程对象#     p.start()#     p.join()#     print('==主开始')多个子进程使用join# from multiprocessing import Process# import time## def task(name,sec):#     print(f'{name}is running')#     time.sleep(sec)#     print(f'{name} is gone')### if __name__ == '__main__':#     start_time = time.time()#     p1 = Process(target=task,args=('太阳',1))#     p2 = Process(target=task,args=('月亮',2))#     p3 = Process(target=task,args=('星星',3))#     p1.start()#     p2.start()#     p3.start()#     print(f'==主{time.time()-start_time}')  # 0.02 这只是主进程结束的时间,与其他进程毫无关系验证 1# from multiprocessing import Process# import time## def task(name,sec):#     print(f'{name}is running')#     time.sleep(sec)#     print(f'{name} is gone')### if __name__ == '__main__':#     start_time = time.time()#     p1 = Process(target=task,args=('太阳',1))#     p2 = Process(target=task,args=('月亮',2))#     p3 = Process(target=task,args=('星星',3))##     p1.start()#     p2.start()#     p3.start()#     # join 只针对主进程,如果join下面多次join 他是不阻塞的.#     p1.join()#     p2.join()#     p3.join()##     print(f'==主{time.time()-start_time}')验证 2# from multiprocessing import Process# import time## def task(name,sec):#     print(f'{name}is running')#     time.sleep(sec)#     print(f'{name} is gone')### if __name__ == '__main__':#     start_time = time.time()#     p1 = Process(target=task,args=('太阳',3))#     p2 = Process(target=task,args=('月亮',2))#     p3 = Process(target=task,args=('星星',1))##     p1.start()#     p2.start()#     p3.start()#     # join就是阻塞##     p1.join()  # 等2s#     print(f'==主1:{time.time()-start_time}')#     p2.join()#     print(f'===主2:{time.time()-start_time}')#     p3.join()#     print(f'==主3:{time.time()-start_time}')  #优化上面的方法# from multiprocessing import Process# import time# # def task(sec):#     print(f'is running')#     time.sleep(sec)#     print(f' is gone')# # # if __name__ == '__main__':#     start_time = time.time()    # p1 = Process(target=task,args=(1,))    # p2 = Process(target=task,args=(2,))    # p3 = Process(target=task,args=(3,))    #    # p1.start()    # p2.start()    # p3.start()    # # join 只针对主进程,如果join下面多次join 他是不阻塞的.    # p1.join()    # p2.join()    # p3.join()        错误示范:    # for i in range(1,4):    #     p = Process(target=task,args=(i,))    #     p.start()    #     p.join()    # '''    # p1 = Process(target=task,args=(1,))    # p1.start()    # p1.join()    # p2 = Process(target=task,args=(2,))    # p2.start()    # p2.join()    # p3 = Process(target=task,args=(3,))    # p3.start()    # p3.join()    #    # '''        正确示范:    # l1 = []    # for i in range(1, 4):    #     p = Process(target=task,args=(i,))    #     l1.append(p)    #     p.start()    #    # for i in l1:    #     i.join()    #    # print(f'==主{time.time()-start_time}')join就是阻塞,主进程有join,主进程下面的代码一律不执行,直到进程执行完毕之后,在执行.

5.进程对象其他属性

# from multiprocessing import Process# import time## def task(name):#     print(f'{name} is running')#     time.sleep(2)#     print(f'{name} is gone')### if __name__ == '__main__':#     # 在windows环境下, 开启进程必须在 __name__ == '__main__' 下面#     # p = Process(target=task,args=('太阳',))  # 创建一个进程对象#     p = Process(target=task,args=('太阳',),name='月亮')  # 创建一个进程对象#     p.start()#     # time.sleep(1)#     # p.terminate()  # 杀死子进程  ***#     # p.join()  # ***#     # time.sleep(0.5)#     # print(p.is_alive())   # ***#     # print(p.name)#     p.name = 'sb'#     print(p.name)#     print('==主开始')

6.守护进程

# 古时候 太监守护这个皇帝,如果皇帝驾崩了,太监直接也就死了.子进程守护着主进程,只要主进程结束,子进程就跟着结束# from multiprocessing import Process# import time## def task(name):#     print(f'{name} is running')#     time.sleep(2)#     print(f'{name} is gone')## if __name__ == '__main__':#     # 在windows环境下, 开启进程必须在 __name__ == '__main__' 下面#     p = Process(target=task,args=('太阳',))  # 创建一个进程对象#     p.daemon = True  # 将p子进程设置成守护进程,只要主进程结束,守护进程马上结束.#     p.start()#     # p.daemon = True  # 一定要在子进程开启之前设置#     time.sleep(1)#     print('===主')

转载于:https://www.cnblogs.com/liubing8/p/11386143.html

你可能感兴趣的文章
【译】在Asp.Net中操作PDF - iTextSharp - 使用字体
查看>>
03 线程池
查看>>
设计模式课程 设计模式精讲 2-2 UML类图讲解
查看>>
Silverlight 的菜单控件。(不是 Toolkit的)
查看>>
linux后台运行和关闭SSH运行,查看后台任务
查看>>
桥接模式-Bridge(Java实现)
查看>>
C# Dynamic通用反序列化Json类型并遍历属性比较
查看>>
exit和return的区别
查看>>
Python(软件目录结构规范)
查看>>
c++||template
查看>>
条件断点 符号断点
查看>>
Dreamweaver cc新版本css单行显示
查看>>
Java基础教程——网络基础知识
查看>>
Kruskal基础最小生成树
查看>>
【hdu 1429】胜利大逃亡(续)
查看>>
javascript之Style物
查看>>
Factory Design Pattern
查看>>
P1192-台阶问题
查看>>
Java线程面试题
查看>>
Flask三剑客
查看>>