如何在不等待每个批处理完成的情况下使用Gevent批量运行gevent线程?

时间:2019-02-06 17:41:59

标签: python-3.x gevent

我编写了一个程序,该程序在执行程序的四个不同阶段将进行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个批次)完成执行?还是我需要等待每个批次的执行之后才能开始下一个批次?

请记住,我存储了来自这些调用的响应,并且响应一直在程序中传递,直到我对数据库进行更新为止。

0 个答案:

没有答案