文章目录
- 进程
-
- 创建进程
-
- os.fork() - 只适用于linux/unix/mac
- multiprocessing模块Process 类
- Pool进程池
- 进程间通信
-
- 队列queue
-
- 常见用法
- 管道pipes
- 线程
-
- 创建线程
- 线程间通信
-
- 互斥锁
- 队列
进程
任务管理器中一个任务就是一个进程
创建进程
os.fork() - 只适用于linux/unix/mac
multiprocessing模块Process 类
multiprocessing使用 Process 类创建进程对象
Process([group[,target[,name[,args[,kwargs]]]]])
参数:
- group: 通常设置为 None,它是为了向后兼容而保留的。在当前版本的 Python 中,此参数始终应为 None。
- target: 一个可调用对象,表示在新进程中要执行的目标函数。可以是函数、方法或其他可调用对象。新进程将调用此目标函数来执行任务。
- name: 为新进程指定的名称,是一个可选参数。如果不提供名称,系统将分配一个唯一的名称给新进程。默认是Process-N,N为1开始的整数。
- args: 一个元组,包含传递给 target 函数的位置参数。如果 target 函数不需要参数,则可以省略此参数。
- kwargs: 一个字典,包含传递给 target 函数的关键字参数。如果 target 函数不需要关键字参数,则可以省略此参数。
常用方法:
- start():
启动进程并调用进程的 run 方法执行任务。 - run():
实际执行进程任务的方法。默认情况下会调用用户自定义的 run 方法,但也可以通过重写此方法来自定义进程的执行逻辑。 - join([timeout]):
等待进程执行结束。如果指定了 timeout 参数,则最多等待 timeout 秒,超时后会继续执行主进程。 - is_alive():
判断进程是否处于活动状态(即正在执行任务)。 - terminate():
终止进程的执行。不管任务是否完成,这将立即终止进程,可能会导致资源泄漏或不完整的清理,因此应谨慎使用。
常用属性:
- name:
进程的名称。可以通过设置 name 属性来为进程指定一个可识别的名称。 - pid:
进程的 ID(PID)。用于唯一标识一个进程。 - daemon:
表示进程是否为守护进程的布尔值。默认情况下,进程是非守护进程(daemon 属性为 False)。可以通过设置 daemon 属性为 True 将进程设置为守护进程。 - authkey:
进程之间通信的身份验证密钥。默认情况下为 None,表示没有启用身份验证。 - exitcode:
进程的退出代码。当进程终止时,exitcode 属性会被设置为进程的退出状态码。
import multiprocessing
# 创建一个继承自 multiprocessing.Process 的子类
class MyProcess(multiprocessing.Process):
def __init__(self, name):
super(MyProcess, self).__init__()
self.name = name
# 实现 run 方法
def run(self):
print(f"Process {
self.name} is executing.")
if __name__ == '__main__':
# 创建进程对象
process1 = MyProcess("1")
process2 = MyProcess("2")
# 启动进程
process1.start()
process2.start()
# 等待进程结束
process1.join()
process2.join()
输出:
Process 2 is executing.
Process 1 is executing.
if __name__ == '__main__':
# 创建进程对象
process1 = MyProcess("1")
process2 = MyProcess("2")
# 启动进程
process2.start()
process1.start()
# 等待进程结束
process1.join()
process2.join()
输出:
Process 1 is executing.
Process 2 is executing.
使用Process子类创建线程,定义__init__()和run()方法,init()中调用Process父类的方法,否则父类的初始化方法会被覆盖,无法开启进程
import multiprocessing
import time
class MyProcess(multiprocessing.Process):
def __init__(self, name):
super().__init__() # 调用父类的__init__()方法
self.name = name
def run(self):
print(f"{
self.name} started")
time.sleep