Python Asyncio如何itertools.循环在同一时间有一个以上的请求

2024-06-09 05:33:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我用的是Sanic,我们用的是一个代理来建立外部连接,用于网络报废。你知道吗

我想创建一个python dict,并在python dict中放置一个代理列表。1=代理连接失败。你知道吗

我希望平均访问一个列表,这样我们的代理就有了一些随时间推移如何使用它们的可预测模式。而不是随机选择它们,这可能导致大量使用1个代理。你知道吗

不过,由于三一重工数量众多。我在想怎么处理这件事。你知道吗

从视觉上看,我的想法是,它就像一行代理,每次请求它时,上面的代理都会执行下一步,一旦调用它,它将再次转到行的后面。你知道吗

类似于,https://docs.python.org/2/library/itertools.html#itertools.cycle似乎是个不错的选择。你知道吗

然而,我的问题是。。。这是如何实现异步和非阻塞的。作为工作者或请求可以同时发生。如果2-50请求同时发生,如何解决此问题。你知道吗


Tags: httpsorg网络docs代理列表数量sanic
1条回答
网友
1楼 · 发布于 2024-06-09 05:33:55

你最好的选择可能是看类似aredis的东西。worker本质上是子流程,因此共享dict不起作用。你知道吗

如果您查看使用workers设置的源代码,请进一步查看名为serve\u 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实现代理吗?你知道吗

相关问题 更多 >