gpt4 book ai didi

python - 为什么 ThreadPool 中的线程不异步运行?

转载 作者:太空宇宙 更新时间:2023-11-04 03:51:09 25 4
gpt4 key购买 nike

我编写了以下概念验证代码:

import time
from multiprocessing.pool import ThreadPool

class Maybe:
def __init__(self):
self._value = None
self._exists = False
def exists(self):
return self._exists
def value(self):
if not self.exists():
raise ValueError("Maybe doesn't hold any value")
return self._value
def set(self, value):
self._value = value
self._exists = True
def unset(self):
self._value = None
self._exists = False

class Future(object):

def __init__(self):
self._holder = Maybe()
self._handler = None

def _set(self, value):
self._holder.set(value)
self._invoke()

def _invoke(self):
if self._handler and self._holder.exists():
self._handler(self._holder.value())

def then(self, handler):
self._handler = handler
self._invoke()


def fib(count):
f,s = 0,1
for i in xrange(count):
f,s =s,f+s
return s

pool = ThreadPool(5)

def test(fun, arg):
def print_fib(x):
print("fib => {0}, {1}\n".format(arg, len(str(x))))
tb = time.time()
future = Future()
future.then(print_fib)
future._async_result = pool.apply_async(fun, [arg], callback=future._set)
ta = time.time()
print ("Time elapsed : {0}".format(ta - tb))
return future


x1=test(fib, 2029)
x2=test(fib, 989999)
x3=test(fib, 103)
x4=test(fib, 38484)
x5=test(fib, 20)

time.sleep(3)

而且我希望所有调用都异步运行。但它们似乎不是异步运行的。例如,使用 103 参数的调用应该在使用 989999 作为参数的调用之前完成。我不认为会发生这种情况。如果我在第二次调用中使用更大的参数,即使是第一次调用也会花费更多时间。

谁能解释一下这是怎么回事?为什么它们不异步运行?

最佳答案

问题是 ThreadPool 将所有线程设置为守护进程,即如果主线程退出,所有线程都将终止。 time.sleep(3) 不足以让您的进程完成其任务,这就是原因。请注意,您的“已用时间”日志不正确,因为它测量的是触发线程所需的时间,而不是实际任务。

您应该始终.join 线程。使用 ThreadPool,您可以使用以下代码实现:

...

x1=test(fib, 2029)
x2=test(fib, 989999)
x3=test(fib, 103)
x4=test(fib, 38484)
x5=test(fib, 20)

pool.close()
pool.join()

同时将所有日志移至 print_fib 函数,它应该会按预期工作。

关于python - 为什么 ThreadPool 中的线程不异步运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21278445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com