Python 使用 time.sleep 时多处理不工作
Python multiprocessing not working when time.sleep is used
我有一个函数需要不同的输入,我希望该函数可以并行 运行。以下是我尝试过的方法,但由于 time.sleep 我认为无法正常工作。
from multiprocessing import Process
from time import sleep
import time
def f(name):
print('hello', name)
time.sleep(10)
l1 = Queue()
a = Process(target=f('Tom'))
a.start()
l2 = Queue()
b = Process(target=f("Stock"))
b.start()
print (l1.get())
print (l2.get())
我希望函数 运行 并行。目前该函数在进入第二次执行之前等待 10 秒。
使用Pool
和starmap
:
import multiprocessing
import time
def f(name, place):
print('hello', name, place)
time.sleep(5)
if __name__ == '__main__':
data = [('Louis', 'val1'), ('Paul', 'val2'), ('Alexandre', 'val3'),
('John', 'val4'), ('Tom', 'val5'), ('Bob', 'val6')]
with multiprocessing.Pool(2) as pool:
pool.starmap(f, data)
Safe importing of main module
Make sure that the main module can be safely imported by a new Python interpreter without causing unintended side effects (such a starting a new process).
查看@juanpa.arrivillaga 发表的评论。只需将函数的 name 指定为 Process
构造函数的 target 参数;不要调用该函数。 target 的参数单独指定为 args 参数,可以是 tuple
或 list
。
此外,由于 f
没有返回有用的值,因此没有理由为结果提供 Queue
个实例。在任何情况下,您都没有将 Queue
实例传递给 f
并且没有任何内容 put
到队列,所以我不明白为什么您会尝试发出对 get
反对这些 Queue
实例;这些电话将永远挂起。您 do 需要传递给 f
的参数是 name,如下所示:
from multiprocessing import Process
#from time import sleep
import time
def f(name):
print('hello', name)
time.sleep(10)
start_time = time.time()
a = Process(target=f, args=('Tom',))
a.start()
b = Process(target=f, args=("Stock",))
b.start()
# Wait for processes to complete
a.join()
b.join()
elapsed_time = time.time() - start_time
print(elapsed_time)
打印:
hello Tom
hello Stock
10.212252855300903
如果您在Windows这样的平台上运行,那么您需要将进程创建代码放在一个特殊的块中,如下所示;
from multiprocessing import Process
#from time import sleep
import time
def f(name):
print('hello', name)
time.sleep(10)
# Required on platforms that create processes with the "spawn" method:
if __name__ == '__main__':
start_time = time.time()
a = Process(target=f, args=('Tom',))
a.start()
b = Process(target=f, args=("Stock",))
b.start()
# Wait for processes to complete
a.join()
b.join()
elapsed_time = time.time() - start_time
print(elapsed_time)
我有一个函数需要不同的输入,我希望该函数可以并行 运行。以下是我尝试过的方法,但由于 time.sleep 我认为无法正常工作。
from multiprocessing import Process
from time import sleep
import time
def f(name):
print('hello', name)
time.sleep(10)
l1 = Queue()
a = Process(target=f('Tom'))
a.start()
l2 = Queue()
b = Process(target=f("Stock"))
b.start()
print (l1.get())
print (l2.get())
我希望函数 运行 并行。目前该函数在进入第二次执行之前等待 10 秒。
使用Pool
和starmap
:
import multiprocessing
import time
def f(name, place):
print('hello', name, place)
time.sleep(5)
if __name__ == '__main__':
data = [('Louis', 'val1'), ('Paul', 'val2'), ('Alexandre', 'val3'),
('John', 'val4'), ('Tom', 'val5'), ('Bob', 'val6')]
with multiprocessing.Pool(2) as pool:
pool.starmap(f, data)
Safe importing of main module
Make sure that the main module can be safely imported by a new Python interpreter without causing unintended side effects (such a starting a new process).
查看@juanpa.arrivillaga 发表的评论。只需将函数的 name 指定为 Process
构造函数的 target 参数;不要调用该函数。 target 的参数单独指定为 args 参数,可以是 tuple
或 list
。
此外,由于 f
没有返回有用的值,因此没有理由为结果提供 Queue
个实例。在任何情况下,您都没有将 Queue
实例传递给 f
并且没有任何内容 put
到队列,所以我不明白为什么您会尝试发出对 get
反对这些 Queue
实例;这些电话将永远挂起。您 do 需要传递给 f
的参数是 name,如下所示:
from multiprocessing import Process
#from time import sleep
import time
def f(name):
print('hello', name)
time.sleep(10)
start_time = time.time()
a = Process(target=f, args=('Tom',))
a.start()
b = Process(target=f, args=("Stock",))
b.start()
# Wait for processes to complete
a.join()
b.join()
elapsed_time = time.time() - start_time
print(elapsed_time)
打印:
hello Tom
hello Stock
10.212252855300903
如果您在Windows这样的平台上运行,那么您需要将进程创建代码放在一个特殊的块中,如下所示;
from multiprocessing import Process
#from time import sleep
import time
def f(name):
print('hello', name)
time.sleep(10)
# Required on platforms that create processes with the "spawn" method:
if __name__ == '__main__':
start_time = time.time()
a = Process(target=f, args=('Tom',))
a.start()
b = Process(target=f, args=("Stock",))
b.start()
# Wait for processes to complete
a.join()
b.join()
elapsed_time = time.time() - start_time
print(elapsed_time)