我使用python multiprocessing
來分叉一些子進程來運行我的作業。有兩個要求:如何區分Multiprocessing.Pool中的進程?
- 我需要知道孩子進程的pid,以防萬一我想要殺死它。
- 我需要回調在作業完成後做一些東西。因爲這些東西在父進程中使用鎖,所以它不能在子進程中完成。
,但我得到:
- 過程中產生的
by multiprocessing.Process()
有一個屬性 「PID」 來獲得它的PID。但是我不能添加異步回調,當然我也不能等待同步。 - 由
multiprocessing.Pool()
生成的進程池提供了回調接口。但我無法分辨池中的哪個進程與我的工作相匹配,因爲我可能需要根據特定的工作來殺死進程。
任務是便宜,這裏顯示了代碼:
import random, time
import multiprocessing
import os
class Job(object):
def __init__(self, jobid, jobname, command):
self.jobid, self.jobname, self.command = jobid, jobname, command
def __str__(self):
return "Job <{0:05d}>".format(self.jobid)
def __repr__(self):
return self.__str__()
def _run_job(job):
time.sleep(1)
print "{} done".format(job)
return job, random.choice([True, False]) # the second argument indicates whether job has finished successfully
class Test(object):
def __init__(self):
self._loc = multiprocessing.Lock()
self._process_pool = multiprocessing.Pool()
def submit_job(self, job):
with self._loc:
self._process_pool.apply_async(_run_job, (job,), callback=self.job_done)
print "submitting {} successfully".format(job)
def job_done(self, result):
with self._loc:
# stuffs after job has finished is related to some cleanning work, so it needs the lock of the parent process
job, success = result
if success:
print "{} success".format(job)
else:
print "{} failure".format(job)
j1 = Job(1, "test1", "command1")
j2 = Job(2, "test2", "command2")
t = Test()
t.submit_job(j1)
t.submit_job(j2)
time.sleep(3.1) # wait for all jobs finishing
但現在我無法得到對應於每個作業的PID。例如,我需要終止作業< 1>,但是我找不到進程池中的哪個進程與作業< 1>相關,所以我可能無法在任何時候終止該作業。
如果我使用multiprocessing.Process
或者,我可以記錄每個進程的PID與其相應的jobid。但我現在不能添加回調方法。
那麼有沒有一種方法來獲得子進程的PID和添加回調方法?
有趣。我有一個類似的問題 - 爲什麼不使用進程列表? – comodoro