ThreadPoolExecutor (TPE) içinde, geri çağrılan her zaman sunulan işlevle aynı iş parçacığında çalışmayı garanti eder mi? Örneğin, aşağıdaki kodu kullanarak bunu test ettim. Ben birçok kez koştu ve func
ve callback
gibi görünüyordu her zaman aynı iş parçacığı koştu. Ben time.sleep(random.random())
ifadeleri, func
yani en azından birkaç fonksiyonları kaldırıldı ve callbacks
aynı iş parçacığı değil koşmak ne zamanPython ThreadPoolExecutor - geri çağrılan func ile aynı iş parçacığında çalışması garanti edilir mi?
import concurrent.futures
import random
import threading
import time
executor = concurrent.futures.ThreadPoolExecutor(max_workers=3)
def func(x):
time.sleep(random.random())
return threading.current_thread().name
def callback(future):
time.sleep(random.random())
x = future.result()
cur_thread = threading.current_thread().name
if (cur_thread != x):
print(cur_thread, x)
print('main thread: %s' % threading.current_thread())
for i in range(10000):
future = executor.submit(func, i)
future.add_done_callback(callback)
Ancak, başarısız gibiydi.
Üzerinde çalıştığım bir proje için, geri çağrılan her zaman sunulan işlevin aynı iş parçacığı üzerinde çalışmalıdır, bu yüzden bunun TPE tarafından garanti edildiğinden emin olmak istedim. (Ve ayrıca rastgele uyku olmadan testin sonuçları şaşırtıcı görünüyordu).
source code for executors'a baktım ve geri bildirimi çalıştırmadan önce iş parçacığını ana iş parçacığına dönüştürmüyor gibi görünmüyor. Ama emin olmak istedim.
Ve ne: Örneğin
? Geri arama 'get_ident' de farklı – Winand