Я использовал Python 3 и написал класс QuotaControl
, который подсчитывал вызов функции, и после каждого quota
вызова его устанавливал таймаут на 5 секунд:
import threading
import datetime
import time
class QuotaControl:
def __init__(self, function):
self.current_usage = 0
self.quota = 3
self.function = function
def __call__(self, *args):
date = datetime.datetime.now(tz=pytz.timezone('Europe/Kiev'))
if self.current_usage % self.quota == 0 and self.current_usage != 0:
date_ = datetime.datetime.now().isoformat()
print(date_ + ' Waiting for 5 seconds.')
time.sleep(5)
print('Current Quota usage: ' + str(self.current_usage))
self.current_usage += 1
return self.function(*args)
Я использовал этокласс в качестве декоратора для этой функции:
@QuotaControl
def f(i):
date = datetime.datetime.now().isoformat()
print(date + ' Calling function. ' + str(i))
time.sleep(6)
date = datetime.datetime.now().isoformat()
print(date + ' Calling finished. ' + str(i))
После этого я использовал lib threading
для запуска асинхронной функции f
:
for i in range(6):
job = threading.Thread(target=f, args=(i,))
job.start()
Я хочу после каждого третьегоДля вызова (quota
) существует задержка до QuotaControl
вызовов f
.
Однако выход ниже:
Current Quota usage: 0
2019-11-08T18:11:20.632455 Calling function. 0
Current Quota usage: 1
2019-11-08T18:11:20.632563 Calling function. 1
Current Quota usage: 2
2019-11-08T18:11:20.632807 Calling function. 2
2019-11-08T18:11:20.632866 Waiting for 5 seconds.
2019-11-08T18:11:20.633046 Waiting for 5 seconds.
2019-11-08T18:11:20.633178 Waiting for 5 seconds.
2019-11-08T18:11:20.633294 Waiting for 5 seconds.
2019-11-08T18:11:20.633416 Waiting for 5 seconds.
2019-11-08T18:11:20.633534 Waiting for 5 seconds.
Current Quota usage: 3
2019-11-08T18:11:25.635995 Calling function. 6
Current Quota usage: 4
2019-11-08T18:11:25.636067 Calling function. 8
Current Quota usage: 5
2019-11-08T18:11:25.636101 Calling function. 5
Current Quota usage: 6
Current Quota usage: 6
2019-11-08T18:11:25.636521 Calling function. 4
2019-11-08T18:11:25.636544 Calling function. 3
Current Quota usage: 8
2019-11-08T18:11:25.636597 Calling function. 7
2019-11-08T18:11:26.635615 Calling finished. 1
2019-11-08T18:11:26.637998 Calling finished. 2
2019-11-08T18:11:26.638148 Calling finished. 0
2019-11-08T18:11:31.639597 Calling finished. 6
2019-11-08T18:11:31.639790 Calling finished. 5
2019-11-08T18:11:31.639861 Calling finished. 7
2019-11-08T18:11:31.640094 Calling finished. 4
2019-11-08T18:11:31.640219 Calling finished. 8
2019-11-08T18:11:31.640273 Calling finished. 3
Я ожидаю, что после третьего и шестогоЯ получу сообщение «Ожидание ...», но оно не появляется.
Я попытался добавить job.join () в конец:
for i in range(6):
job = threading.Thread(target=f, args=(i,))
job.start()
job.join()
, но затем ятерял асинхронность и выполнял работу один за другим.
Не могли бы вы помочь мне с моей проблемой, пожалуйста? Мне нужна задержка после каждого третьего или шести асинхронных вызовов.