В ThreadPoolExecutor (TPE), всегда ли обратный вызов работает в том же потоке, что и представленная функция?
Например, я проверил это со следующим кодом. Я запускал его много раз, и казалось, что func
и callback
всегда работают в одном потоке.
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)
Однако, когда я удалил операторы time.sleep(random.random())
, я потерял, по крайней мере, несколько функций func
и callbacks
не выполнял в том же потоке.
Для проекта, над которым я работаю, обратный вызов должен всегда запускаться в том же потоке, что и переданная функция, поэтому я хотел быть уверенным, что это гарантировано TPE. (А также результаты теста без случайного сна казались озадачивающими).
Я просмотрел исходный код для исполнителей, и, похоже, мы не переключили поток в основной поток, прежде чем запускаем обратный вызов. Но просто хотел быть уверенным.