Запрос асинхронных значений без блокировки - PullRequest
0 голосов
/ 19 мая 2019

Приведенный ниже код имитирует синхронный код 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

Спасибо!

...