Я написал программу, которая будет выполнять 210 вызовов на 4 разных этапах во время выполнения моей программы.Он написан на Python 3.6 и использует Gevent (с патчем обезьяны).На каждом этапе он будет выполнять 50 вызовов, а затем запускать gevent.joinall () в указанных потоках.
Это обходной путь, который я реализовал, потому что достиг скорости в 50 вызовов / сек.Поэтому, когда я делаю эти вызовы, я беру по 50 за раз и пакетирую их (15-секундная задержка между ними, используя gevent.sleep (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]:
Каждую партию можно представить как список порожденных гринлетных нитей.Есть ли способ запустить каждую партию (с 15-секундной задержкой), а затем дождаться завершения всех 210 (5 партий)?Или мне нужно подождать выполнения каждого пакета, прежде чем начинать следующий?
Пожалуйста, имейте в виду, что я храню ответы на эти вызовы, и ответы передаются через программу до конца, когда я делаю обновление базы данных.