首页 > 解决方案 > 将异步对象转换为列表

问题描述

我正在尝试从 proxybroker 获取代理列表:

import asyncio
from proxybroker import Broker

async def show(proxies):
    while True:
        proxy = await proxies.get()
        if proxy is None: break
        print('Found proxy: %s' % proxy)

proxies = asyncio.Queue()
broker = Broker(proxies)
tasks = asyncio.gather(
    broker.find(types=['HTTP', 'HTTPS'], limit=10),
    show(proxies))

loop = asyncio.get_event_loop()
result_now = loop.run_until_complete(tasks)

但是,我不确定如何将最终结果转换为普通列表。有什么帮助吗?谢谢!

标签: pythonasynchronous

解决方案


看来您问题中的代码是从 Python 复制粘贴的:Correct way of using proxybroker lib with asyncio

再次检查一下,看看这个片段实际上应该做什么(打印代理,而不是返回它们)

根据您的问题,要使用代理生成的代理填充 result_now,您需要从“读取器”协程返回一个值,该协程使用代理通过队列生成的异步事件。

带有模拟替换代理的示例:

import asyncio

async def broker_mock(proxy_queue):
    for item in [1, 2, 3, 4, 5]:
        proxy = await proxy_queue.put(item)
    await proxy_queue.put(None)

async def show(proxy_queue):
    found = []
    while True:
        proxy = await proxy_queue.get()
        if proxy is None: break
        found.append(proxy)
    return found

proxy_queue = asyncio.Queue()
tasks = asyncio.gather(broker_mock(proxy_queue), show(proxy_queue))
loop = asyncio.get_event_loop()
result_now = loop.run_until_complete(tasks)
print(result_now[1])
# should printout: [1, 2, 3, 4, 5]

我建议阅读https://docs.python.org/3/library/asyncio-task.html以进一步解释 asyncio。


推荐阅读