美文网首页
asyncio中的最大并发数

asyncio中的最大并发数

作者: 飞跑的蛤蟆 | 来源:发表于2020-05-07 17:15 被阅读0次

最近在使用异步并发库写爬虫时,遇到了一个错误ValueError: too many file descriptors in select(),这个错误大概是select使用了太多的文件描述符

查了查资料,发现asyncio中有用到select,而select是系统IO多路复用的一种方式,它会限制单个进程打开文件描述符的数量(linux是1024个,window是509个),如果超出这个值程序就会报错

下面是报错的代码(节选):

...
async def request():
    url = 'http://127.0.0.1:5000'
    print('Waiting for ', url)
    result = await get(url)
    print('Get response from ', url, 'Result: ', result)


def main():
    loop = asyncio.get_event_loop()
    tasks = [asyncio.ensure_future(request()) for _ in range(1000)]
    loop.run_until_complete(asyncio.wait(tasks))
...

代码解析:
main函数中创建了1000个任务对象,然后将这些任务对象以awaitable对象的形式注入到事件循环中,接下来事件循环会调用之前的协程对象。这些代码看似没有问题,但是创建任务对象时创建的太多了,远超出了系统的限制。

解决方案:

asyncio.Semaphore类是同步装置,用于限制并发请求
async with 则是异步上下文管理器

semaphore = asyncio.Semaphore(500)

async def request():
    async with semaphore:
        url = 'http://127.0.0.1:5000'
        result = await get(url)

相关文章

  • asyncio中的最大并发数

    最近在使用异步并发库写爬虫时,遇到了一个错误ValueError: too many file descripto...

  • asyncio并发编程-上

    asyncio是Python中解决异步I/O高并发的一个模块。 asyncio的事件循环 我们先看下asyncio...

  • (转载)Python 标准库 asyncio

    前言 asyncio 是 Python 3.3 的 asyncio 模块。asyncio 提供编写单线程并发代码,...

  • iOS实录16:GCD小结之控制最大并发数

    导语:在GCD的使用中,需要考虑控制最大并发数 和 线程同步这两个问题,本文主要介绍GCD中如何控制最大并发数 。...

  • Tomcat并发问题

    Tomcat的最大并发数是可以配置的,实际运用中,最大并发数与硬件性能和CPU数量都有很大关系的。更好的硬件,更多...

  • asyncio并发编程-中

    ThreadPoolExecutor和asyncio完成阻塞IO请求 这个小节我们看下如何将线程池和asyncio...

  • OS开发多线程篇—NSOperation基本操作

    一、并发数 (1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同...

  • asyncio 自学笔记

    asyncio 是用来编写 并发 代码的库,使用 async/await 语法。很好的参考 asyncio.run...

  • 信号量Semaphore

    异步并发控制线程数 dispatch_semaphore_create 设置最大并发数 dispatch_sema...

  • Python协程之asyncio

    asyncio 是 Python 中的异步IO库,用来编写并发协程,适用于IO阻塞且需要大量并发的场景,例如爬虫、...

网友评论

      本文标题:asyncio中的最大并发数

      本文链接:https://www.haomeiwen.com/subject/dggoghtx.html