python3 asyncio 不阻塞_连接不与Python3 asyncio并发的HTTP请求关闭

我刚刚开始使用Python3.4中的asyncio库,并编写了一个小程序,试图同时获取50个网页。经过几百次请求后,程序爆炸,出现“打开文件太多”异常。

我认为我的fetch方法用'response.read_and_close()'方法调用来关闭连接。

任何想法发生了什么?我是否正确地解决这个问题?

import asyncio

import aiohttp

@asyncio.coroutine

def fetch(url):

response = yield from aiohttp.request('GET', url)

response = yield from response.read_and_close()

return response.decode('utf-8')

@asyncio.coroutine

def print_page(url):

page = yield from fetch(url)

# print(page)

@asyncio.coroutine

def process_batch_of_urls(round, urls):

print("Round starting: %d" % round)

coros = []

for url in urls:

coros.append(asyncio.Task(print_page(url)))

yield from asyncio.gather(*coros)

print("Round finished: %d" % round)

@asyncio.coroutine

def process_all():

api_url = 'https://google.com'

for i in range(10):

urls = []

for url in range(50):

urls.append(api_url)

yield from process_batch_of_urls(i, urls)

loop = asyncio.get_event_loop()

loop.run_until_complete(process_all())我得到的错误是:

Traceback (most recent call last):

File "/usr/local/lib/python3.4/site-packages/aiohttp/client.py", line 106, in request

File "/usr/local/lib/python3.4/site-packages/aiohttp/connector.py", line 135, in connect

File "/usr/local/lib/python3.4/site-packages/aiohttp/connector.py", line 242, in _create_connection

File "/usr/local/Cellar/python3/3.4.1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/asyncio/base_events.py", line 424, in create_connection

File "/usr/local/Cellar/python3/3.4.1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/asyncio/base_events.py", line 392, in create_connection

File "/usr/local/Cellar/python3/3.4.1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/socket.py", line 123, in __init__

OSError: [Errno 24] Too many open files

During handling of the above exception, another exception occurred:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值