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 秒。

使用Poolstarmap:

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)

仔细阅读multiprocessing guidlines

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 参数,可以是 tuplelist

此外,由于 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)