Python - асинхронный HTTP-запрос, блокировка в конце для полного ответа HTTP (urllib3, запросы, многопоточность) - PullRequest
0 голосов
/ 10 декабря 2018

Меня не особо интересует используемый метод, будь то urllib3, запросы или даже многопоточность.Я использую библиотеку программного обеспечения, которая имеет понятие «задачи».Я перехватываю функции beginTask и taskComplete следующим образом:

class addon:


    def __init__(self):
        self.passed_check={}

    def beginTask(self, task):

            r = requests.get("https://website.com/?name="+task.attribute);
            result = json.loads(r.text)
            if(result['attr']==1):
                self.passed_check[task.id]=1


    def taskComplete(self, task):

        if(self.passed_check[task.id]):
            #do SOMETHING
        else:
            #do Something else

Поток кода:

  1. Библиотека обрабатывает начальное состояние задачи.- Обрабатывается библиотекой.

  2. Функция beginTask запускается.- Я переопределил его своим аддоном, обычно он пустой.

  3. Начинается интенсивная задача ввода-вывода.- Обрабатывается собственной библиотекой.

  4. запускается функция taskComplete.- Я переопределил его своим аддоном, обычно он пустой.

Проблема, с которой я столкнулся с приведенным выше кодом, заключается в том, что мой вызов запросов блокирует IO, поэтому блокируетостальная часть задачи.Это не правильно, но я действительно хочу сделать что-то вроде.

class addon:


    def __init__(self):
        self.passed_check={}
        self.requests_mapper={}

    def beginTask(self, task):

            self.requests_mapper[task.id] = requests.get("https://website.com/?name="+task.attribute, async=True);


    def taskComplete(self, task):

        while self.requests_mapper[task.id].request_complete == False:
            pass

        result = json.loads(r.text)
        if(result['attr']==1):
            self.passed_check[task.id]=1

        if(self.passed_check[task.id]):
            #do SOMETHING
        else:
            #do Something else

По сути, я хочу запустить асинхронный вызов, чтобы сделать HTTP-запрос, позволить библиотеке и HTTP-запросу работать параллельно, но дозавершение задачи гарантирует, что HTTP-запрос завершен, чтобы я мог выполнить свою задачу (что является причиной цикла while, теоретически задача может быть завершена до возвращения HTTP-запроса).Мне также нужно убедиться, что ответ whole получен, чтобы я мог правильно оценить его до завершения задачи.Мне нужно заблокировать функцию taskComplete.

Поскольку несколько задач могут выполняться в тандеме, я использую request_mapper, который является dict, отображаемым по идентификатору задачи, чтобы отслеживать, к какой задаче принадлежит запрос.

Вот диаграмма (я пока не могу связать):

https://i.stack.imgur.com/Hy4cO.png

Любые предложения.

...