我有一个函数可以从一个巨大的 CSV 文件中懒惰地生成行:
def get_next_line():
with open(sample_csv,'r') as f:
for line in f:
yield line
def do_long_operation(row):
print('Do some operation that takes a long time')
我需要使用线程,以便我可以调用从上述函数获得的每条记录 do_long_operation
。
网上大部分地方都有这样的例子,我不太确定自己走的路对不对。
import threading
thread_list = []
for i in range(8):
t = threading.Thread(target=do_long_operation, args=(get_next_row from get_next_line))
thread_list.append(t)
for thread in thread_list:
thread.start()
for thread in thread_list:
thread.join()
我的问题是:
我如何只启动有限数量的线程,比如 8 个?
我如何确保每个线程都会从
get_next_line
获得一行?
原文由 user3249433 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以使用来自
multiprocessing
的线程池并将您的任务映射到工作池:这将创建八个工作人员并将您的行一一提交给他们。一旦一个进程“空闲”,它就会被分配一个新的任务。
也有一个注释掉的导入语句。如果您注释掉
ThreadPool
并从 multiprocessing 导入Pool
,您将获得子进程而不是线程,这在您的情况下可能更有效。