当第一个并行进程在 python3 中完成时,如何终止并行进程?



问题:当进程编号 1 完成后,如何停止第 2 号进程?

更长的版本:我制作了一个多进程 2 函数的脚本,我真的不知道当第一个进程完成后如何停止第二个进程。

我的代码:

def printHelloWorld(): # So this takes 5.0053 seconds to completly run
print("Hello World.")
time.sleep(5)
print("Hello World. (after 5 seconds)")

def printText(): # And this takes 10.0102 seconds to completly run
print("Some text.")
time.sleep(10)
print("Some text. (after 10 seconds)")

if __name__ == "__main__": # I multiprocessed these 2 functions to reduce time. 
# But what I actually want is to terminate process 2 when process 1 has finished.
p1 = Process(target = printHelloWorld) 
p2 = Process(target = printText)
p1.start()
p2.start()          
p1.join()
p2.join()

我尝试了一个 while 循环来检查何时p1.is_alive == False然后我应该终止进程 2,但它不起作用。我也搜索了答案,但没有找到任何符合我要求的答案。

感谢您的阅读/回答!

让我澄清一些事情:如果我无法正确解释它,我很抱歉,但我想问的是,我如何检查哪个首先完成并终止第二个过程,因为它不再需要?

示例:如果我们不知道函数 1 和函数 2 的执行时间(两个函数都在并行进程中(,该怎么办?因此,一旦第一个进程停止,我希望另一个进程停止。我该怎么做?我希望现在对此有所描述。再次抱歉造成混乱!

我建议你使用Pebble库。它包装了Python的标准库线程和多处理对象。但它很有可能取消正在运行的调用

import time
from concurrent.futures import wait, FIRST_COMPLETED
from pebble import ProcessPool
def printHelloWorld():  # So this takes 5.0053 seconds to completly run
print("Hello World.")
time.sleep(5)
print("Hello World. (after 5 seconds)")

def printText():  # And this takes 10.0102 seconds to completly run
print("Some text.")
time.sleep(10)
print("Some text. (after 10 seconds)")

if __name__ == "__main__":  # I multiprocessed these 2 functions to reduce time.
with ProcessPool(max_workers=2) as pool:
f1 = pool.schedule(printHelloWorld)
f2 = pool.schedule(printText)
done, not_done = wait((f1, f2), return_when=FIRST_COMPLETED)
for f in not_done:
f.cancel()

你试过Process.terminate吗?

import time
from multiprocessing import Process

def printHelloWorld(): # So this takes 5.0053 seconds to completly run
print("Hello World.")
time.sleep(5)
print("Hello World. (after 5 seconds)")

def printText(): # And this takes 10.0102 seconds to completly run
print("Some text.")
time.sleep(10)
print("Some text. (after 10 seconds)")

if __name__ == "__main__": # I multiprocessed these 2 functions to reduce time.
# But what I actually want is to terminate process 2 when process 1 has finished.
p1 = Process(target = printHelloWorld)
p2 = Process(target = printText)
p1.start()
p2.start()
p1.join()
p2.terminate()  # terminate process 2
p2.join()

相关内容

  • 没有找到相关文章