- import multiprocessing
-
- # 定义一个任务函数
- def worker(num):
- print(f'Worker {num} started')
- # 这里可以执行具体的任务逻辑
- # ...
-
- # 创建多个进程
- if __name__ == '__main__':
- processes = []
-
- for i in range(5):
- p = multiprocessing.Process(target=worker, args=(i,))
- processes.append(p)
- p.start()
- # 等待所有进程完成
- for p in processes:
- p.join()
- print('All processes completed')
输出
Worker 0 started
Worker 1 started
Worker 2 started
Worker 3 started
Worker 4 started
All processes completed
这是一段最简单的多进程代码
在上面我们用到了multiprocessing.Process类,传入了一个target,这个参数是方法的的全称
并且不带括号!!!;传入一个args,这是方法需要的参数,以元组的形式传递。
进程的启动是调用start()方法,调用完start之后做了以下操作
1.检查进程的状态,确保它尚未开始运行。
2.在操作系统中创建一个新的进程。
3.将进程的任务逻辑传递给操作系统,以便在新进程中执行。
4.在新进程中调用进程的run()方法,执行任务逻辑。
5.如果进程是守护进程,则设置它的守护属性。
6.开始执行新进程中的任务逻辑
之后循环进程列表,执行join方法,调用完join之后做了以下操作
1.阻塞当前进程,直到调用join()方法的进程执行完毕。
2.等待被调用的进程完成其任务逻辑。
3.如果被调用的进程是守护进程,join()方法会将它标记为已完成,以便主进程可以正常退出。
需要注意的是,join()方法会阻塞当前进程,直到被调用的进程执行完毕。这意味着主进程会等待子进程完成后再继续执行后续的代码
其他一些常用的属性和方法
1.设置进程名使用name参数
p = multiprocessing.Process(target=worker, name='WorkerProcess')
2.查看进程的pid
p.pid
3.检查进程是否存活
p.is_alive()
4.定义进程的执行逻辑
在Python多进程中,run()方法是multiprocessing模块中Process类的一个方法。它定义了进程的执行逻辑,即进程启动后要执行的代码。
当调用start()方法启动进程时,会自动调用进程对象的run()方法来执行进程的任务逻辑。
以下是一个示例代码,演示了如何在自定义的进程类中重写run()方法:
import multiprocessing
# 自定义进程类,继承自multiprocessing.Process
class MyProcess(multiprocessing.Process):
def run(self):
print(f'Worker started in process {self.name}')
# 执行进程的任务逻辑
print('Worker is doing some work...')
print(f'Worker finished in process {self.name}')
5.终止进程的执行
p.terminate()
6.关闭进程
p.close()
7.terminate()方法和close()方法的区别
terminate(): 该方法用于强制终止进程,即立即停止进程的执行,不管进程是否已经完成任务。当调用terminate()方法时,进程会立即退出,不会执行任何清理操作。
terminate()方法是非阻塞的,即调用该方法后,主进程不会等待被终止的进程完成。它会立即返回,主进程可以继续执行后续的代码。
被终止的进程无法捕获到terminate()方法的调用,也无法执行任何终止前的清理操作。
close(): 该方法用于关闭进程,即告诉进程不再接收新的任务,但允许进程完成当前的任务。当调用close()方法后,进程不会立即退出,而是继续执行直到完成任务。
close()方法是阻塞的,调用该方法后,主进程会等待被关闭的进程完成当前任务后再继续执行后续的代码。
被关闭的进程可以通过监听KeyboardInterrupt异常等方式来判断是否需要退出,并执行相应的清理操作。