使用asyncio可以有多个循环吗?如果回答是"是",我该怎么做?

提取URL的示例:

import asyncio
import aiohttp
from suburls import extractsuburls

@asyncio.coroutine
def extracturls(url):
    subtasks = []
    response = yield from aiohttp.request('GET', url)
    suburl_list = yield from response.text()
    for suburl in suburl_list:
        subtasks.append(asyncio.Task(extractsuburls(suburl)))
     loop = asyncio.get_event_loop()
     loop.run_until_complete(asyncio.gather(*subtasks))

 if __name__ == '__main__':
     urls_list = ['http://example1.com', 'http://example2.com']
     for url in url_list: 
          subtasks.append(asyncio.Task(extractsuburls(url)))  
     loop = asyncio.get_event_loop()
     loop.run_until_complete(asyncio.gather(*subtasks))
     loop.close()

如果我执行这段代码,当python试图启动第二个循环时,就会出现一个错误,即循环已经在运行.

另外:我的模块"extractsuburls"使用aiohttp来执行web请求.

编辑:

我try 过这个解决方案:

import asyncio
import aiohttp
from suburls import extractsuburls

@asyncio.coroutine
def extracturls( url ):
    subtasks = []
    response = yield from aiohttp.request('GET', url)
    suburl_list = yield from response.text()
    jobs_loop = asyncio.new_event_loop()
    for suburl in suburl_list:
        subtasks.append(asyncio.Task(extractsuburls(suburl)))
     asyncio.new_event_loop(jobs_loop)
     jobs_loop.run_until_complete(asyncio.gather(*subtasks))
     jobs_loop.close()

 if __name__ == '__main__':
     urls_list = ['http://example1.com', 'http://example2.com']
     for url in url_list: 
          subtasks.append(asyncio.Task(extractsuburls(url)))  
     loop = asyncio.get_event_loop()
     loop.run_until_complete(asyncio.gather(*subtasks))
     loop.close()

但我有一个错误:循环参数必须与future 一致

知道吗?

推荐答案

您不需要几个事件循环,只需在extracturls()协同程序中使用yield from gather(*subtasks)即可:

import asyncio
import aiohttp
from suburls import extractsuburls

@asyncio.coroutine
def extracturls(url):
    subtasks = []
    response = yield from aiohttp.request('GET', url)
    suburl_list = yield from response.text()
    for suburl in suburl_list:
        subtasks.append(extractsuburls(suburl))
    yield from asyncio.gather(*subtasks)

 if __name__ == '__main__':
     urls_list = ['http://example1.com', 'http://example2.com']
     for url in url_list: 
          subtasks.append(extractsuburls(url))
     loop = asyncio.get_event_loop()
     loop.run_until_complete(asyncio.gather(*subtasks))
     loop.close()

因此,您需要等待子任务,直到extracturls个任务完成.

Python-3.x相关问答推荐

类型注释:pathlib. Path vs importlib. resources. abc. Traversable

Pandas 数据帧断言等同于NaN

如何从拼图分区数据集中读取数据到Polar

安装grpcio时出现错误DeproationWarning:pkg_resource

将f-字符串放置在f-字符串内

我可以设置树视图层次 struct 按钮吗?

Python 舍入数字不准确

在REPLACE INTO中引用变量会抛出sqlite3.OperationalError

DataFrame列中如何迭代重复值?

调用 Clear 时 Airflow 会加载新代码吗

将自动文本转换为 DataFrame

如何将搜索结果中的所有值保存在另一个列表中?

正则表达式来识别用 Python 写成单词的数字?

在判断列表变量时如何判断特定列的值并分配加权整数值

如何从脚本中提取 PDF 文档的标题以进行重命名?

在数据类中创建类变量的正确方法

Selenium (Python) - 使用 Chrome 网络驱动程序等待下载过程完成

在计算之前删除包含某些值的组合

哪个更有效:Python 文档字符串还是类型提示?

字典理解中的操作顺序