gpt4 book ai didi

python - 即使我先尝试启动过程,过程也会在调用函数后启动

转载 作者:行者123 更新时间:2023-12-03 13:02:09 25 4
gpt4 key购买 nike

我正在尝试学习如何在Python中使用多个进程,并且遇到了与以下示例类似的问题。
我尝试使用p1启动一个名为.start()的过程,然后再调用do_something()函数。问题在于该函数在进程开始之前被称为
我使用的代码:

import time
from multiprocessing import Process


def complex_calculation():
start_timer = time.time()
print("Started calculating...")
[x ** 2 for x in range(20000000)] # calculation
print(f"complex_calculation: {time.time() - start_timer}")


def do_something():
print(input("Enter a letter: "))


if __name__ == "__main__":
p1 = Process(target=complex_calculation)
p1.start()
do_something()
p1.join()
如果我使用time.sleep(),它似乎可以工作:
if __name__ == "__main__":
p1 = Process(target=complex_calculation)
p1.start()
time.sleep(1)
do_something()
p1.join()
我的问题是:
  • 为什么会发生这种情况?
  • 我可以怎么做,而不必使用time.sleep()
  • 最佳答案

    如评论中所指出的,多个进程同时运行。如果不做一些额外的工作,就无法保证操作系统安排进程运行的顺序。因此,当您在p1.start()之前调用do_something()时,这意味着在do_something运行之前,与启动进程相关的Python代码已完成。但是p1表示的实际过程可能相对于Python代码的其余部分以任何方式运行。它可以完全在Python代码的其余部分之前,之后或以任何方式交错运行。依靠race condition的一种定义以任何特定方式进行调度。
    要控制这些进程彼此相对运行的方式,您需要一个同步原语。有many ways to synchronize进程,它仅取决于您要完成什么。如果要确保在调用complex_calculation之前已启动do_something函数,则event可能是最简单的方法。例如:

    import time
    from multiprocessing import Process, Event


    def complex_calculation(event):
    event.set() # Set the event, notifying any process waiting on it
    start_timer = time.time()
    print("Started calculating...")
    [x ** 2 for x in range(20000000)] # calculation
    print(f"complex_calculation: {time.time() - start_timer}")


    def do_something(event):
    event.wait() # Wait for `complex_calculation` to set the event
    print(input("Enter a letter: "))


    if __name__ == "__main__":
    event = Event()
    p1 = Process(target=complex_calculation, args=(event,))
    p1.start()
    do_something(event)
    p1.join()
    您应该看到类似以下内容的内容:
    $ python3 test.py
    Started calculating...
    Enter a letter: a
    a
    complex_calculation: 6.86732816696167

    关于python - 即使我先尝试启动过程,过程也会在调用函数后启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63689723/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com