Асинхронный вызов и задержка выполнения функции в Python - PullRequest
0 голосов
/ 08 ноября 2019

Я использовал 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()

, но затем ятерял асинхронность и выполнял работу один за другим.

Не могли бы вы помочь мне с моей проблемой, пожалуйста? Мне нужна задержка после каждого третьего или шести асинхронных вызовов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...