我编写了一个程序,该程序在执行程序的四个不同阶段将进行210次调用。它是用python 3.6编写的,并使用gevent(带有猴子补丁)。在每个阶段,它将批处理50个调用,然后在所述线程上运行gevent.joinall()。
这是我实施的解决方法,因为我达到了50个呼叫/秒的速率限制。因此,当我拨打这些电话时,我一次取了50个电话并进行了批处理(使用gevent.sleep(15)间隔15秒)
我当前的解决方法:
def func(args, batch_size, batch):
for i in range(0, len(args), batch_size):
threads=[]
for arg in args[i:i+batch_size]:
if func.__name__ == 'check_vsi':
if 'WIN' in self.history[arg]['order']['os_code']:
start_time = time.time()
threads.append(gevent.spawn(self.check_vsi, arg, start_time, 1800))
else: wait 15 min
start_time = time.time()
threads.append(gevent.spawn(self.check_vsi, arg, start_time, 900))
else:
print('Args are {}'.format(args))
threads.append(gevent.spawn(func, arg))
gevent.joinall(threads)
print('Sleeping for 15 seconds between batches')
gevent.sleep(15) # sleep 15 seconds between batches
_ = [results.append(t.value) for t in threads]:
人们可以将每个批次视为生成的greenlet线程的列表。有没有一种方法可以运行每个批次(延迟15秒),然后等待所有210个(5个批次)完成执行?还是我需要等待每个批次的执行之后才能开始下一个批次?
请记住,我存储了来自这些调用的响应,并且响应一直在程序中传递,直到我对数据库进行更新为止。