英文:
Why does the status of parallel jobs is never set to "finished" even after job finished?
问题
以下是您要求的翻译:
我使用下面的代码作为一个并行运行作业的示例。尽管从输出中我可以看到作业已经完成,但状态仍然为false。为什么会这样?我期望 "status_dict" 的状态在作业完成后会更改为 "True"。
但从下面的输出中,我们可以看到即使作业已经完成,状态仍然保持为False。
----------123
{'JOB4': False, 'JOB11': False, 'JOB23': False}
----
JOB4 False
Starting job JOB11...
Starting job JOB4...
Starting job JOB23...
----
JOB11 False
----
JOB23 False
----
JOB4 False
Finished job JOB23.
Finished job JOB4.
Finished job JOB11.
----
JOB11 False
----
JOB23 False
----
JOB4 False
----
JOB11 False
代码:
import multiprocessing, time
# 并行运行作业
def run_job(jn, par):
print(f"Starting job {jn}...")
time.sleep(3)
print(f"Finished job {jn}.")
if __name__ == '__main__':
list_jobs = ["JOB4", "JOB11", "JOB23"]
processes = []
status_dict = multiprocessing.Manager().dict()
for jn in list_jobs:
par = {}
par["sleep"] = 5
status_dict[jn] = False
p = multiprocessing.Process(target=run_job, args=(jn, par))
processes.append(p)
p.start()
print("------------123")
print(status_dict)
while not all(status_dict.values()):
for job_id, status in status_dict.items():
print("----")
print(job_id, status)
time.sleep(1)
print("ENDE")
英文:
I use below code as an example to run jobs in parallel. Even though I see from output that the Jobs have finished, the status is still false. Why is that? I would expect that the status of "status_dict" changes to "True" for finished jobs.
But from below output we see that status stays False even when job has finished.
----------123
{'JOB4': False, 'JOB11': False, 'JOB23': False}
----
JOB4 False
Starting job JOB11...
Starting job JOB4...
Starting job JOB23...
----
JOB11 False
----
JOB23 False
----
JOB4 False
Finished job JOB23.
Finished job JOB4.
Finished job JOB11.
----
JOB11 False
----
JOB23 False
----
JOB4 False
----
JOB11 False
Code:
import multiprocessing, time
# run jobs parallel
def run_job(jn, par):
print(f"Starting job {jn}...")
time.sleep(3)
print(f"Finished job {jn}.")
if __name__ == '__main__':
list_jobs = ["JOB4", "JOB11", "JOB23"]
processes = []
status_dict = multiprocessing.Manager().dict()
for jn in list_jobs:
par = {}
par["sleep"] = 5
status_dict[jn] = False
p = multiprocessing.Process(target=run_job, args=(jn, par))
processes.append(p)
p.start()
print("------------123")
print(status_dict)
while not all(status_dict.values()):
for job_id, status in status_dict.items():
print("----")
print(job_id, status)
time.sleep(1)
print("ENDE")
答案1
得分: 0
问题在于我没有更新状态。以下代码有效:
import multiprocessing, time
# 并行运行作业
def run_job(jn, status):
print(f"Starting job {jn}...")
time.sleep(3)
status.value = True
print(f"Finished job {jn}.")
if __name__ == '__main__':
list_jobs = ["JOB4", "JOB11", "JOB23"]
processes = []
status_dict = {}
for jn in list_jobs:
par = {}
par["sleep"] = 5
status_dict[jn] = multiprocessing.Value('b', False)
p = multiprocessing.Process(target=run_job, args=(jn, status_dict[jn]))
processes.append(p)
p.start()
print("------------123")
for i in range(100):
print(status_dict)
for k in status_dict:
print("----")
print(k, status_dict[k].value)
time.sleep(1)
print("ENDE")
如果您有其他问题,请随时提出。
英文:
Problem is I was not updating the status. Below code works:
import multiprocessing, time
# run jobs parallel
def run_job(jn, status):
print(f"Starting job {jn}...")
time.sleep(3)
status.value = True
print(f"Finished job {jn}.")
if __name__ == '__main__':
list_jobs = ["JOB4", "JOB11", "JOB23"]
processes = []
status_dict = {}
for jn in list_jobs:
par = {}
par["sleep"] = 5
status_dict[jn] = multiprocessing.Value('b', False)
p = multiprocessing.Process(target=run_job, args=(jn, status_dict[jn]))
processes.append(p)
p.start()
print("------------123")
for i in range(100):
print(status_dict)
for k in status_dict:
print("----")
print(k, status_dict[k].value)
time.sleep(1)
print("ENDE")
答案2
得分: 0
status_dict 之所以对所有作业保持False状态,是因为你没有在run_job函数内更新字典。
要更新作业的状态,你可以将status_dict作为参数传递给run_job函数,并在作业完成时在函数内更新它。修改后的函数代码如下:
def run_job(jn, par, status_dict):
print(f"Starting job {jn}...")
time.sleep(3)
print(f"Finished job {jn}.")
status_dict[jn] = True
然后,在启动进程时,你可以将status_dict作为参数传递:
p = multiprocessing.Process(target=run_job, args=(jn, par, status_dict))
经过这些更改,代码应该可以正常运行了。
英文:
The reason why the status_dict remains False for all jobs is because you're not updating the dictionary within the run_job function.
To update the status of a job, you can pass the status_dict as an argument to the run_job function, and update it within the function whenever a job is finished. Modified code of function:
def run_job(jn, par, status_dict):
print(f"Starting job {jn}...")
time.sleep(3)
print(f"Finished job {jn}.")
status_dict[jn] = True
Then, when you start the processes, you can pass the status_dict as an argument:
p = multiprocessing.Process(target=run_job, args=(jn, par, status_dict))
After these changes the code should be fine and work as excepted.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论