我寫了下面驗證的概念代碼:爲什麼ThreadPool的線程不能異步運行?
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
作爲參數之前完成。我沒有看到發生。即使是第一次通話,如果我在第二次通話中使用更大的參數,也需要更多時間
有人可以解釋發生了什麼事嗎?爲什麼他們不能異步運行?
你會得到什麼輸出?你怎麼知道最先完成的是什麼? – user2357112
@ user2357112:查看名爲'print_fib'的回調。這告訴我哪一個先完成,等等。 – Nawaz
請將你得到的輸出粘貼到問題中。該計劃花費多長時間才能完成? –