📅  最后修改于: 2023-12-03 15:40:42.286000             🧑  作者: Mango
在Python中,使用池(Pool)可以方便地并行执行任务。然而,有时候在池中执行任务时,并不希望在控制台中打印出进程ID。本文将介绍如何在池中执行任务时禁止打印进程ID。
我们可以通过重载Process
类的_bootstrap
方法,让池中的进程不打印进程ID。
from multiprocessing import Pool, Process
import os
class NoPIDProcess(Process):
def _bootstrap(self):
# ignore printing PID
def dummy():
pass
self._popen = self._Popen(process_obj=self, daemon=self._daemon,
dummy=dummy)
self._sentinel = self._popen.sentinel
class NoPIDPool(Pool):
Process = NoPIDProcess
上述代码中,我们定义了一个NoPIDProcess
类,该类继承自Process
类,在_bootstrap
方法中重载了self._Popen()
方法,将其第三个参数dummy
设为了一个简单的函数,以忽略打印进程ID的功能。
接着,我们定义了NoPIDPool
类,该类从Pool
类继承,覆盖了其中的Process
属性,将其设为了我们定义的NoPIDProcess
类。
现在,我们就可以使用NoPIDPool
类创建池,从而在执行任务时不打印进程ID了。
def task(i):
print(f"Task {i} is executed by process {os.getpid()}.")
if __name__ == '__main__':
pool = NoPIDPool(processes=4)
pool.map(task, range(10))
上述代码中,我们定义了一个简单的任务函数task(i)
,该函数接收一个整数参数i
,打印出当前任务的编号和其被哪个进程执行。接着,我们在if __name__ == '__main__':
中创建了一个NoPIDPool
实例,并用map()
方法执行任务。执行结果如下:
Task 0 is executed by process 18508.
Task 1 is executed by process 18508.
Task 2 is executed by process 18509.
Task 3 is executed by process 18507.
Task 4 is executed by process 18508.
Task 5 is executed by process 18509.
Task 6 is executed by process 18507.
Task 7 is executed by process 18509.
Task 8 is executed by process 18507.
Task 9 is executed by process 18508.
可以看到,在池中执行任务时,并没有打印进程ID,这正是我们期望的结果。
本文介绍了如何在Python中使用池执行任务时,禁止打印进程ID。我们通过重载Process
类的_bootstrap
方法,实现了在池中执行任务时忽略打印进程ID的功能。这个方法可以在需要并行执行任务,但不希望打印进程ID的场合下使用。