我有一个简单的代码,它对生成器中的每个项目运行一个GET请求,我正在尝试加速:
def stream(self, records):
# type(records) = <type 'generator'>
for record in records:
# record = OrderedDict([('_time', '1518287568'), ('data', '5552267792')])
output = rest_api_lookup(record[self.input_field])
record.update(output)
yield record
现在,这是在一个线程上运行的,因为每次REST调用都要等到上一个REST调用完成。在
在使用这个伟大的答案(https://stackoverflow.com/a/28463266/1150923)之前,我已经在Python中使用了一个列表中的多线程处理,但是我不确定如何在生成器而不是列表上重用相同的策略。在
我从一个开发伙伴那里得到了一些建议,他建议我将生成器分成100个元素列表,然后关闭池,但我不知道如何从生成器创建这些列表。在
我还需要保持原来的顺序,因为我需要yield record
按正确的顺序。在
我假设您不想首先将生成器
records
转换为列表。加快处理速度的一种方法是将记录传递到ThreadPoolExecutor
块中。执行器将为块的所有项同时处理rest_api_lookup
。然后你只需要“取消”你的结果。下面是一些正在运行的示例代码(它不使用类,抱歉,但我希望它显示了原理):啊!在
更新:我在模拟的REST调用中添加了一个
sleep
,使其更真实。这个分块版本在我的机器上只需1.5秒。顺序版本需要10秒(正如预期的那样,100*0.1s=10s)。在下面是一个如何使用
concurrent.futures
进行操作的示例:相关问题 更多 >
编程相关推荐