Меня не особо интересует используемый метод, будь то 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
Поток кода:
Библиотека обрабатывает начальное состояние задачи.- Обрабатывается библиотекой.
Функция beginTask запускается.- Я переопределил его своим аддоном, обычно он пустой.
Начинается интенсивная задача ввода-вывода.- Обрабатывается собственной библиотекой.
запускается функция 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
Любые предложения.