Python并发编程之进程简介
一、multiprocessing 进程简介
multiprocessing模块所有的重点都放在进程上。
Process([group [, target [, name [, args [, kwargs]]]]])
- group 指定进程组,大多数情况下用不到,值为None
- target 是当进程启动时执行的可调用对象
- args 是传递给target的位置参数的元组
- kwargs 是传递给target的关键字参数的字典
二、Process实例的方法
Process的实例p具有以下方法
- p.is_alive
如果p仍然在运行,则返回True - p.join(timeout)
等待进程p终止。timeout是可选的超时期限。进程可以被join无数次,但如果连接自身则会出错 - p.run()
进程启动时运行的方法。默认情况下,会调用传递给Process构造函数的target。定义进程的另一种方法是从Process类继承并重写run()函数 - p.start()
启动进程。这将运行代表进程的子进程,并调用该子进程中的p.run()函数 - p.terminate()
强制终止进程。如果调用此函数,进程p将被立即终止,同时不会进行任何清理动作。如果进程p创建了它自己的子进程,这些进程将变成僵尸进程。所以使用此方法时需要特别小心。如果p保存了一个锁定或通过进程间通信被调用,那么终止它可能会导致死锁或I/O崩溃。
三、Process实例的属性
Process的实例p也具有以下数据属性
- p.authkey
进程的身份验证键。除非显示设定,这是由os.urandom()函数生成的32字符的字符串。这个键的用途是为涉及网络连接的底层进程间通信提供安全性。这类连接只有在两端具有相同的身份验证键时才能成功。 - p.daemon
一个Boolean标志,指示进程是否是后台进程。当创建它的python进程终止时,后台进程将自动终止。另外,禁止后台进程创建自己的新进程。p.daemon的值必须在使用p.start()函数启动进程之前进行设置。 - p.exitcode
进程的整数退出代码。如果进程仍然在运行,它的值为none。如果值为负数,-N表示进程由信号N所终止 - p.name
进程的名称 - p.pid
进程的整数进程ID。
四、Process使用示例
- 以单独进程的形式创建和启动函数(或其他可调用对象)
import multiprocessing
import time
def clock(interval):
while True:
print("the time is %s" % time.ctime())
time.sleep(interval)
if __name__ == '__main__':
# 注意args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号
p = multiprocessing.Process(target = clock, args = (15, ))
p.start()
- 将进程定义为继承自Process的类
import multiprocessing
import time
class ClockProcess(multiprocessing.Process):
def __init__(self, interval):
multiprocess.Process.__init__(self)
self.interval = interval
def run(self):
while True:
print("the time is %s" % time.ctime())
time.sleep(self.interval)
if __name__ == '__main__':
p = ClockProcess(15)
p.start()
上述两个例子中,子进程应该每隔15秒打印一次时间。需要注意的是,为了实现跨平台的可移植性,只能像上面这样由主程序创建新的进程。这在unix上是可选的,但在windows上是必须的。在windows上,很可能需要在命令行中运行上述例子,例如在vscode中,不能以调试模式运行,只能以非调试模式执行。