Python asyncio / aiohttp:ValueError:Windows上select()中的文件描述符太多
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python asyncio / aiohttp:ValueError:Windows上select()中的文件描述符太多,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3017字,纯文字阅读大概需要5分钟。
内容图文
![Python asyncio / aiohttp:ValueError:Windows上select()中的文件描述符太多](/upload/InfoBanner/zyjiaocheng/955/25eee2572d984c05895adad387300bab.jpg)
大家好,
我在尝试理解asyncio和aiohttp并使两者正常工作时遇到了麻烦.不仅我没有正确理解我在做什么,此时我遇到了一个我不知道如何解决的问题.
我正在使用Windows 10 64位,最新更新.
以下代码使用asyncio返回标题中Content-Type中不包含html的页面列表.
import asyncio
import aiohttp
MAXitems = 30
async def getHeaders(url, session, sema):
async with session:
async with sema:
try:
async with session.head(url) as response:
try:
if "html" in response.headers["Content-Type"]:
return url, True
else:
return url, False
except:
return url, False
except:
return url, False
def checkUrlsWithoutHtml(listOfUrls):
headersWithoutHtml = set()
while(len(listOfUrls) != 0):
blockurls = []
print(len(listOfUrls))
items = 0
for num in range(0, len(listOfUrls)):
if num < MAXitems:
blockurls.append(listOfUrls[num - items])
listOfUrls.remove(listOfUrls[num - items])
items +=1
loop = asyncio.get_event_loop()
semaphoreHeaders = asyncio.Semaphore(50)
session = aiohttp.ClientSession()
data = loop.run_until_complete(asyncio.gather(*(getHeaders(url, session, semaphoreHeaders) for url in blockurls)))
for header in data:
if False == header[1]:
headersWithoutHtml.add(header)
return headersWithoutHtml
listOfUrls = ['http://www.google.com', 'http://www.reddit.com']
headersWithoutHtml= checkUrlsWithoutHtml(listOfUrls)
for header in headersWithoutHtml:
print(header[0])
当我运行它时,让我们说,2000 urls(有时)它会返回类似于:
data = loop.run_until_complete(asyncio.gather(*(getHeaders(url, session, semaphoreHeaders) for url in blockurls)))
File "USER\AppData\Local\Programs\Python\Python36-32\lib\asyncio\base_events.py", line 454, in run_until_complete
self.run_forever()
File "USER\AppData\Local\Programs\Python\Python36-32\lib\asyncio\base_events.py", line 421, in run_forever
self._run_once()
File "USER\AppData\Local\Programs\Python\Python36-32\lib\asyncio\base_events.py", line 1390, in _run_once
event_list = self._selector.select(timeout)
File "USER\AppData\Local\Programs\Python\Python36-32\lib\selectors.py", line 323, in select
r, w, _ = self._select(self._readers, self._writers, [], timeout)
File "USER\AppData\Local\Programs\Python\Python36-32\lib\selectors.py", line 314, in _select
r, w, x = select.select(r, w, w, timeout)
ValueError: too many file descriptors in select()
注1:我在用户中用USER编辑了我的名字.
注2:无论出于何种原因reddit.com返回,因为它不包含HTML,这是一个完全独立的问题,我将尝试解决,但是如果你发现我的代码中有一些其他不一致的问题,那么请指出它.
注3:我的代码构造错误,因为我试图改变很多东西来尝试调试这个问题,但我没有运气.
我听说过这是Windows的一个限制,没有办法绕过它,问题是:
a)我直接不明白“select()”中的文件描述符太多是什么意思.
b)Windows无法处理的错误是什么?我见过人们用asyncio和aiohttp推送成千上万的请求但是即使我的chuncking我也不能在没有得到值错误的情况下推动30-50?
编辑:结果是MAXitems = 10它还没有让我崩溃,但因为我不能按照模式我不知道为什么或如何告诉我什么.
编辑2:没关系,它需要更多的时间来崩溃,但最终甚至用MAXitems = 10
解决方法:
默认情况下,Windows在asyncio循环中只能使用64个套接字.这是底层select() API调用的限制.
要增加限制,请使用ProactorEventLoop.安装说明是here.
内容总结
以上是互联网集市为您收集整理的Python asyncio / aiohttp:ValueError:Windows上select()中的文件描述符太多全部内容,希望文章能够帮你解决Python asyncio / aiohttp:ValueError:Windows上select()中的文件描述符太多所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。