同时执行一个函数多次
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()
...
我有一个具有简单功能的 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()
...