Python Asyncio How To itertools.cycle с более чем 1 запросом в одно и то же время

Я использую Sanic, мы используем прокси-сервер для создания внешних подключений для веб-лома.

Я хочу создать python dict и поместить список прокси в python dict. В этом Словаре, мы будем хранить такие значения, как 0, 1. 1= прокси-соединение.

Я ищу для равномерного доступа к списку, поэтому наши прокси имеют предсказуемую картину того, как они используются с течением времени. Вместо случайного выбора их, которые могут привести к интенсивному использованию 1 прокси-сервера над другими.

Однако, поскольку у Саника есть несколько рабочих. Я пытаюсь понять, как с этим справиться.

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

Что-то вроде https://docs.python.org/2/library/itertools.html#itertools.cycle кажется отличным вариантом.

Тем не менее, мой вопрос ... Как это может произойти async'd и не блокировать. Как рабочий или запрос может произойти в одно и то же время. Как это можно решить, если запрос 2-50 происходит одновременно.

python,python-3.x,asynchronous,sanic,

0

Ответов: 1


0

Лучше всего посмотреть на что-то вроде aredis . Рабочие по существу являются подпроцессами, поэтому общий дикт не будет работать.

Если вы посмотрите в исходном коде, где используются рабочие параметры, далее вниз по линии в методе serve_multiple

   def serve_multiple(server_settings, workers):
"""Start multiple server processes simultaneously.  Stop on interrupt
and terminate signals, and drain connections when complete.

:param server_settings: kw arguments to be passed to the serve function
:param workers: number of workers to launch
:param stop_event: if provided, is used as a stop signal
:return:
"""
server_settings['reuse_port'] = True

# Handling when custom socket is not provided.
if server_settings.get('sock') is None:
    sock = socket()
    sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    sock.bind((server_settings['host'], server_settings['port']))
    sock.set_inheritable(True)
    server_settings['sock'] = sock
    server_settings['host'] = None
    server_settings['port'] = None

def sig_handler(signal, frame):
    logger.info("Received signal %s. Shutting down.", Signals(signal).name)
    for process in processes:
        os.kill(process.pid, SIGINT)

signal_func(SIGINT, lambda s, f: sig_handler(s, f))
signal_func(SIGTERM, lambda s, f: sig_handler(s, f))

processes = []
for _ in range(workers):
    process = Process(target=serve, kwargs=server_settings)
    process.daemon = True
    process.start()
    processes.append(process)

for process in processes:
    process.join()

# the above processes will block this until they're stopped
for process in processes:
    process.terminate()
server_settings.get('sock').close()

У Redis есть очередь, поэтому вы можете взять что-то из очереди, а затем заменить ее, если потребуется.

Я представляю себе прокси-сервер, с которым вы можете связаться с nginx?

Python, Python-3.х, асинхронный, sanic,
Похожие вопросы
Яндекс.Метрика