你似乎排除了这个可能性,但我怀疑
https://docs.python.org/3/library/concurrent.futures.html#threadpoolexecutor
或
https://docs.python.org/3/library/concurrent.futures.html#processpoolexecutor
如果您能够移动到Python 3,或者为Python 2添加依赖项,那么这将是可行的。
如果在处理每个文件之前不必触发每个文件的额外工作,那么可以使用一个协调线程来触发所有其他线程,这样就可以防止死锁,如下例所示。
from concurrent.futures import ThreadPoolExecutor
import time
pool = ThreadPoolExecutor(max_workers=3)
def find_work_inputs(dummy_file):
print("{}: Finding work...".format(dummy_file))
time.sleep(1)
work = range(0, dummy_file)
print("{}: Work is {}".format(dummy_file, work))
return work
def do_work(dummy_file, work_input):
print("{}: {}".format(dummy_file, work_input))
print("{}: Doing work {}...".format(dummy_file, work_input))
time.sleep(1)
return work_input * work_input
dummy_files = [1,2,3,4,5]
futures = []
for dummy_file in dummy_files:
work_inputs = pool.submit(find_work_inputs, dummy_file)
for work_input in work_inputs.result():
result = work_input
futures.append((dummy_file, result, pool.submit(do_work, dummy_file, result)))
for dummy_file, work_input, future in futures:
print("Result from file:{} input:{} is {}".format(dummy_file, work_input, future.result()))
或者,如果第一级上的每个线程都需要自己触发工作,那么额外的工作可能需要在另一个池中以防止死锁(取决于何时
result()
在每个未来调用)如下所示。
from concurrent.futures import ThreadPoolExecutor
import time
find_work_pool = ThreadPoolExecutor(max_workers=3)
do_work_pool = ThreadPoolExecutor(max_workers=3)
def find_work_inputs(dummy_file):
print("{}: Finding work...".format(dummy_file))
time.sleep(1)
work = range(0, dummy_file)
print("{}: Work is {}".format(dummy_file, work))
futures = []
for work_input in work:
futures.append((dummy_file, work_input, do_work_pool.submit(do_work, dummy_file, work_input)))
return futures
def do_work(dummy_file, work_input):
print("{}: {}".format(dummy_file, work_input))
print("{}: Doing work {}...".format(dummy_file, work_input))
time.sleep(1)
return work_input * work_input
dummy_files = [1,2,3,4,5]
futures = []
for dummy_file in dummy_files:
futures.extend(find_work_pool.submit(find_work_inputs, dummy_file).result())
for dummy_file, work_input, future in futures:
print("Result from file:{} input:{} is {}".format(dummy_file, work_input, future.result()))