我相信您希望在代码中使用threading.Thread和{a1}。在from queue import Queue

from threading import Thread
import time
def f1(q, x):
# Sleep function added to compare execution times.
time.sleep(5)
# Instead of returning the result we put it in shared queue.
q.put(x * 2)
def f2(q, x):
time.sleep(5)
q.put(x ^ 2)
if __name__ == '__main__':
x1 = 10
x2 = 20
result_queue = Queue()
# We create two threads and pass shared queue to both of them.
t1 = Thread(target=f1, args=(result_queue, x1))
t2 = Thread(target=f2, args=(result_queue, x2))
# Starting threads...
print("Start: %s" % time.ctime())
t1.start()
t2.start()
# Waiting for threads to finish execution...
t1.join()
t2.join()
print("End: %s" % time.ctime())
# After threads are done, we can read results from the queue.
while not result_queue.empty():
result = result_queue.get()
print(result)

上面的代码应该打印类似以下内容的输出:

^{pr2}$

如您所见,即使这两个函数都要等待5秒才能产生结果,但它们是并行执行的,因此总体执行时间为5秒。在

如果您关心的是哪个函数将什么结果放入队列,我可以看到两个解决方案来确定这一点。您可以创建多个队列,也可以将结果包装在一个元组中。在def f1(q, x):

time.sleep(5)
# Tuple containing function information.
q.put((f1, x * 2))

为了避免函数和函数的重复调用(特别是为了避免函数和代码的重复调用,您可以在不使用函数和函数的情况下进一步简化):def wrap_result(func):

def wrapper(*args):
# Assuming that shared queue is always the last argument.
q = args[len(args) - 1]
# We use it to store the results only if it was provided.
if isinstance(q, Queue):
function_result = func(*args[:-1])
q.put((func, function_result))
else:
function_result = func(*args)
return function_result
return wrapper
@wrap_result
def f1(x):
time.sleep(5)
return x * 2

请注意,我的decorator是匆忙编写的,它的实现可能需要改进(例如,如果您的函数接受kwargs)。如果决定使用它,则必须以相反的顺序传递参数:t1 = threading.Thread(target=f1, args=(x1, result_queue))。在

一点友好的建议。

“下面的代码不起作用”并没有说明这个问题。这会引发例外吗?它会带来意想不到的结果吗?在

阅读错误信息很重要。更重要的是——研究它们的意义。您提供的代码引发了一个TypeError并带有非常明显的消息:File ".../stack.py", line 16, in out = (p.

map([f1, f2], [x1, x2]))
TypeError: 'list' object is not callable

这意味着Pool().map()的第一个参数必须是callable对象,例如函数。让我们看看这个方法的文档。在Apply func to each element in iterable, collecting the

results in a
list that is returned.

显然,它不允许函数列表作为参数传递。

Here你可以阅读更多关于Pool().map()方法的信息。