~~并发编程(三):开启进程~~
进击のpython
并发编程——开启进程
上一节说了那么多关于进程的东西,那这一节就尝试着自己开启一下进程
这一节我们可以尝试着使用multiprocessing模块开启进程
通过掌握multiprocessing模块开启进程的两种方式
是我们在后面的学习的基础,所以一定要好好看
multiprocessing模块
首先,由于语言特点,python的多线程没办法使用多核优势
所以说,但凡我们想要利用到多核的优势,在python中大部分都要用到多进程
基于python的模块多且广的优势,在多进程方面就有了multiprocessing这个模式进行支持
这个模块提供的功能众多:支持子进程等等,提供了Process,Queue,Pipe和Lock等组件
但是!这里需要强调一个问题就是:
与线程不同,进程没有任何共享状态,进程修改的数据,改动仅限于该进程内
Process类
class Process(object):
def __init__(self, group=None, target=None, name=None, args=(), kwargs={}):
self.name = ''
self.daemon = False
self.authkey = None
self.exitcode = None
self.ident = 0
self.pid = 0
self.sentinel = None
介绍一下参数:
group:参数未使用,值始终是None
target:表示调用对象,即子进程要执行的任务(就是塞进去一个你想执行的函数)
args:表示调用对象的位置参数元祖(就是对函数进行传参)
kwargs:表示调用对象的字典(就是对函数进行传参)
name:子进程的名字
介绍一下属性:
p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程
当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程
必须在p.start()之前设置
p.name:进程的名称
p.pid:进程的pid
def run(self):
pass
def start(self):
pass
def terminate(self):
pass
def join(self, timeout=None):
pass
def is_alive(self):
return False
接下来介绍一下方法:
p.start():启动进程,并调用该子进程中的p.run()
p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法
p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方 法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁
p.is_alive():如果p仍然运行,返回True
p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)
timeout是可选的超时时间
Process的使用
首先很重要的一点就是,在windows系统,进程的开启必须放到if name == 'main':的下面
第一种方法
from multiprocessing import Process
def func(name, *args, **kwargs):
print(f'{name}执行!')
pass
if __name__ == '__main__':
p = Process(target=func, args=('子进程',))
p.start()
print('我是主进程... ...')
在主进程中创建一个子进程,用来执行函数func,并对函数进行传参
然后利用start进行声明子进程
第二种方法
from multiprocessing import Process
class Myprocess(Process):
"""这是Myprocess"""
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
print(f'{self.name}执行!')
if __name__ == '__main__':
p = Myprocess('子进程')
p.start()
print('我是主进程... ...')
这种方法用的太少了,就看一下了解一下就行
更多的还是第一种方法的使用