同时执行一个函数多次

Executing one function multiple times simultaneously

我有一个具有简单功能的 Python 脚本。我想同时 运行 这个函数 2 次,想知道这是否可行。

script.py:

from multiprocessing import Process
import time

def func1():
    time.sleep(1)
    print('Finished sleeping')


t1_start = time.perf_counter()
p1 = Process(target=func1())
p1 = Process(target=func1())

t1_stop = time.perf_counter()

print("elapsed time: {} sec".format(round(t1_stop - t1_start), 1))

给定输出:

Finished sleeping
Finished sleeping
elapsed time: 2 sec

预期输出:

Finished sleeping
Finished sleeping
elapsed time: 1 sec

我也试过这个:

from multiprocessing import Process
import time

def func1():
    time.sleep(1)
    print('Finished sleeping')

if __name__ == '__main__':
    t1_start = time.perf_counter()
    p1 = Process(target=func1)  # note no ()
    p2 = Process(target=func1)  # note no ()

    p1.start()
    p2.start()

    t1_stop = time.perf_counter()

    print("elapsed time: {} sec".format(round(t1_stop - t1_start), 1))

但是给出了这个输出:

elapsed time: 0 sec
Finished sleeping
Finished sleeping
  • target=func1() 调用 func1 并传递其 return 值(在本例中为 None)作为 Process 的目标参数而不是传递函数 func1 本身。

  • Process(...) 只是创建一个 Process 对象。您从未真正 spawn/execute 任何已创建的 Process 对象。您需要添加对 .start 的调用。根据 OS(即,如果 os.fork 用于生成新进程),这还需要我们添加 __main__ 守卫(无论使用什么,这都是最佳实践) OS).

  • 您正在使用 p1 两次。

试试这个:

from multiprocessing import Process
import time

def func1():
    time.sleep(1)
    print('Finished sleeping')

if __name__ == '__main__':
    t1_start = time.perf_counter()
    p1 = Process(target=func1)  # note no ()
    p2 = Process(target=func1)  # note no ()

    p1.start()
    p2.start()

    t1_stop = time.perf_counter()

    print("elapsed time: {} sec".format(round(t1_stop - t1_start), 1))

这给出了输出

elapsed time: 0 sec
Finished sleepingFinished sleeping

这是有道理的。如果该函数在单独的进程中执行 2 次,然后在主进程中执行,则主进程根本不会执行 time.sleep(1)

但是,如果我们添加.join()那么主进程将被强制等待子进程:

p1.start()
p2.start()

p1.join()
p2.join()

现在输出与您要求的输出相同:

Finished sleeping
Finished sleeping
elapsed time: 1 sec

编辑:如果你想要任意数量的带有循环的进程:

...
times = 3
processes = []
for _ in range(times):
    p = Process(target=func1)
    p.start()
    processes.append(p)

for p in processes:
    p.join()
...