ThreadPoolExecutor (TPE)에서 콜백은 항상 제출 된 함수와 동일한 스레드에서 실행되도록 보장됩니까?Python ThreadPoolExecutor - 제출 된 func와 동일한 스레드에서 실행되도록 보장되는 콜백입니까?
예를 들어 다음 코드로 테스트했습니다. 여러 번 실행했는데 func
과 callback
은 항상 같은 스레드에서 실행되었습니다. 나는 time.sleep(random.random())
문, func
즉 적어도 몇 가지 기능을 제거하고 callbacks
가 동일한 스레드에 있지 실행했을 때
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)
그러나 실패 할 것 같았다.
내가 작업중인 프로젝트의 경우 콜백은 항상 제출 된 함수와 동일한 스레드에서 실행되어야하므로 TPE에 의해 보장되는지 확인하고 싶습니다. (또한 임의의 수면을 거치지 않은 결과도 수수께끼처럼 보였습니다).
나는 source code for executors을보고 콜백을 실행하기 전에 스레드를 메인 스레드로 전환하는 것처럼 보이지 않습니다. 그러나 단지 확신하고 싶었습니다.
그리고 무엇 : 예를 들어
? 콜백의'get_ident'도 다릅니다. – Winand