Приведенный ниже код имитирует синхронный код Python (в приведенном ниже основном потоке), вызывая объект, ответственный за проверку связи с удаленным API.Мы заботимся о возвращаемом значении этого API, но если я сделаю какое-либо назначение переменных, код будет блокироваться при ожидании возвращаемого значения (длительная задержка ввода-вывода в сети), и, следовательно, второй пинг будет задержан
Моя главная проблема заключалась в том, чтобы быстро получить второй пинг (т.е. не дожидаясь возвращения первого).Я знаю, что asyncio отлично подойдет для этой цели, но это часть большой программы, и поэтому переписать все - не вариант.
Вопросы:
1) Под нагрузкой может приведенный ниже кодстолкнуть меня с проблемами параллелизма, такими как неопределенные состояния и / или условия гонки?
2) Безопасно ли фиксировать возвращаемые значения в базу данных nosql (я имею в виду очередь Redis), чтобы ее 'rpoped'основной поток позже и обработан соответственно?
3) Есть ли лучший способ выполнить то, что я ищу?
from concurrent.futures import ThreadPoolExecutor
import time
print(time.time())
class ApiSender():
def ping(self, n):
print("Starting ThreadPoolExecutor")
executor = ThreadPoolExecutor(max_workers=5)
executor.submit(self.curl_Api, (n))
print("Done curling ", n)
def curl_Api(n):
print(n)
time.sleep(4) #Hitting the API
time.sleep(.1) #Write the return value to a DB queue to be picked up later?
print("Processing {}".format(time.time()))
#Simulates a thread wanting to ping an API an undefined number of times.
while True:
z = ApiSender()
z.ping(1)
z.ping(2) # Second ping must depart right away
time.sleep(.2)
print(time.time())
time.sleep(5)
break
Спасибо!