Trong ThreadPoolExecutor (TPE), gọi lại luôn được đảm bảo để chạy trong cùng một luồng với chức năng đã gửi?Python ThreadPoolExecutor - là cuộc gọi lại được bảo đảm để chạy trong cùng một luồng như được gửi func?
Ví dụ: tôi đã thử nghiệm mã này bằng mã sau. Tôi chạy nó nhiều lần và có vẻ như func
và callback
luôn chạy trong cùng một chuỗi.
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)
Tuy nhiên, nó dường như thất bại khi tôi loại bỏ các time.sleep(random.random())
báo cáo, ví dụ ít nhất một vài func
chức năng và callbacks
không chạy trong cùng một thread.
Đối với một dự án mà tôi đang làm việc, cuộc gọi lại phải luôn chạy trên cùng một luồng với chức năng được gửi, vì vậy tôi muốn đảm bảo rằng điều này được đảm bảo bởi TPE. (Và cũng là kết quả của bài kiểm tra mà không có giấc ngủ ngẫu nhiên có vẻ khó hiểu).
Tôi đã xem source code for executors và có vẻ như chúng tôi không chuyển chuỗi sang chuỗi chính trước khi chúng tôi chạy gọi lại. Nhưng chỉ muốn chắc chắn.
Và những gì về 'ProcessPoolExecutor'? Callback của 'get_ident' cũng khác nhau – Winand