每当我对使用 asyncio 和 aiohttp 访问的 API 执行超过 200 个请求时,我都会收到 aiohttp client_exception.ServerDisconnectedError。它似乎不是我的代码,因为它与较少数量的请求一致地工作,但在任何较大数量上都失败。试图了解此错误是否与 aiohttp、我的代码或 API 端点本身有关?网上似乎没有太多关于这个的信息。
Traceback (most recent call last):
File "C:/usr/PycharmProjects/api_framework/api_framework.py", line 27, in <module>
stuff = abc.do_stuff_2()
File "C:\usr\PycharmProjects\api_framework\api\abc\abc.py", line 72, in do_stuff
self.queue_manager(self.do_stuff(json_data))
File "C:\usr\PycharmProjects\api_framework\api\abc\abc.py", line 115, in queue_manager
loop.run_until_complete(future)
File "C:\Python36x64\lib\asyncio\base_events.py", line 466, in run_until_complete
return future.result()
File "C:\usr\PycharmProjects\api_framework\api\abc\abc.py", line 96, in do_stuff
result = await asyncio.gather(*tasks)
File "C:\usr\PycharmProjects\api_framework\api\abc\abc.py", line 140, in async_post
async with session.post(self.api_attr.api_endpoint + resource, headers=self.headers, data=data) as response:
File "C:\Python36x64\lib\site-packages\aiohttp\client.py", line 843, in …Run Code Online (Sandbox Code Playgroud) 在我的 Django 应用程序中,我需要将来自用户的请求代理到其他服务器。我使用asyncio/aiohttp client.
#user->request
.....
loop = asyncio.get_event_loop()
future = asyncio.ensure_future(self.run(t1, t2, t3))
loop.run_until_complete(future)
......
# response
Run Code Online (Sandbox Code Playgroud)
当我的 django 服务器以 启动时python manager.py runserver,当用户请求时出现以下错误。
运行时错误:线程“Thread-1”中没有当前事件循环。
但是当我开始时Gunicorn,一切都很好。
也许我应该使用new_event_loop?
为什么没有问题Gunicorn?
我想在 nginx 网络服务器上运行 aiohttp 后端服务。两者都应该在 docker 容器中运行。此外,我的前端 Angular 应用程序应该访问我的后端服务。
我希望 nginx 网络服务器可以连接到我在 docker 中运行的后端系统 aiohttp。
当我尝试在我的 aiohttp 后端服务上调用 GET 请求时,我总是在 docker 日志中收到错误消息。
nginx_1 | 2018/09/29 13:48:03 [错误] 6#6:*1 connect() 失败(111:连接被拒绝),同时连接到上游,客户端:172.19.0.1,服务器:,请求:“GET /toolservice/波动性?command=pslist HTTP/1.1”,上游:“ http://172.19.0.2:80/toolservice/volatility?command=pslist ”,主机:“localhost”nginx_1 | 172.19.0.1 - - [29/Sep/2018:13:48:03 +0000] "GET /toolservice/volatility?command=pslist HTTP/1.1" 502 576 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-"
version: '3'
services:
nginx:
build: ./nginx
restart: always
depends_on:
- toolservice
- ifs
ports:
- "80:80"
ifs: …Run Code Online (Sandbox Code Playgroud) 我正在使用带有 limited_as_completed 方法的 aiohttp 来加速报废(大约 1 亿个静态网站页面)。但是,代码在几分钟后停止,并返回 TimeoutError。我尝试了几件事,但仍然无法阻止引发 asyncio.TimeoutError。请问我如何忽略错误并继续?
我正在运行的代码是:
N=123
import html
from lxml import etree
import requests
import asyncio
import aiohttp
from aiohttp import ClientSession, TCPConnector
import pandas as pd
import re
import csv
import time
from itertools import islice
import sys
from contextlib import suppress
start = time.time()
data = {}
data['name'] = []
filename = "C:\\Users\\xxxx"+ str(N) + ".csv"
def limited_as_completed(coros, limit):
futures = [
asyncio.ensure_future(c)
for c in islice(coros, 0, limit)
]
async def first_to_finish(): …Run Code Online (Sandbox Code Playgroud) python exception-handling timeoutexception python-asyncio aiohttp
我有一个带有 HTTP 端点的 aiohttp (3.4.4) 服务器,该端点将文件作为输入(客户端发出多部分表单 POST)。我有一个测试客户端,可以向端点发送 10K POST。服务器端点如下所示:
async def event_handler(request):
files = await request.post()
file_field = files['file_from_client']
file_contents = file_field.file.read()
Run Code Online (Sandbox Code Playgroud)
间歇性地,当我的端点尝试查看 POST 有效负载中提供的文件时,我收到以下异常:
"~/venv/python3.7/site-packages/aiohttp/web_protocol.py", line 390, in start
"~/venv/python3.7/site-packages/aiohttp/web_app.py", line 366, in _handle
"~/projects/my_project/controllers.py", line 58, in event_handler
"~/venv/python3.7/site-packages/aiohttp/web_request.py", line 585, in post
"~/venv/python3.7/tempfile.py", line 618, in TemporaryFile
"~/venv/python3.7/tempfile.py", line 258, in _mkstemp_inner
OSError: [Errno 24] Too many open files: '/tmp/tmpjnt4eu_k'
Run Code Online (Sandbox Code Playgroud)
(注意:event_handler 的第 58 行是“await request.post()”行)
我知道是什么原因造成的。我的进程的文件描述符限制设置为默认值 1024,并且我的客户端在我的服务器上抛出了足够多的请求,以至于超出了该限制。我的问题是我不确定最好的服务器缓解是什么。
这篇文章提到了这个问题,有两种可能的解决方案:增加服务端进程的文件描述符数量,或者在客户端引入一个信号量来保证很多请求永远不会被发送到服务端。后者对于测试问题都很好,但我不控制生产中的客户端。前者很容易完成,并减轻了这个特定问题,但它似乎只是提高了天花板 - 有足够的请求,似乎仍然会发生这个问题。
是否可以对 aiohttp 服务器尝试一次处理的请求数量进行限制,并让其他服务器排队等待?
正如文档所建议的那样,该程序应该允许使用一个 aiohttp.ClientSession 运行多个 https get 请求。它旨在运行电报机器人。
我无法通过 try ... except 捕获异常。因此程序在退出时挂起。在扩展会话期间,错误会打印在命令窗口中(但不会打印在错误日志中)。
SSL error in data received
protocol: <asyncio.sslproto.SSLProtocol object at 0x0000016A581E4400>
transport: <_SelectorSocketTransport fd=644 read=polling write=<idle, bufsize=0>>
Traceback (most recent call last):
File "C:\Users\annet\Anaconda3\lib\asyncio\sslproto.py", line 526, in data_received
ssldata, appdata = self._sslpipe.feed_ssldata(data)
File "C:\Users\annet\Anaconda3\lib\asyncio\sslproto.py", line 207, in feed_ssldata
self._sslobj.unwrap()
File "C:\Users\annet\Anaconda3\lib\ssl.py", line 767, in unwrap
return self._sslobj.shutdown()
ssl.SSLError: [SSL: KRB5_S_INIT] application data after close notify (_ssl.c:2592)
^C
Run Code Online (Sandbox Code Playgroud)
由于错误信息非常不具体,我无法真正隔离来源并有一个简短的代码来重现错误。示例代码位于https://github.com/fhag/telegram2.git下的 github 上 。为了运行代码,您需要一个来自您自己机器人的电报的 API 令牌。当我升级到 python 3.7.1 时第一次出现这个错误。Python 在 Windows …
我正在使用aiohttp开发一个 Web 应用程序,其中用户身份验证是使用aiohttp-security 实现的。我使用nginx进行服务器部署。该配置的灵感来自aiohttp 文档,如下所示:
location /api {
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_buffering off;
proxy_pass http://127.0.0.1:8080/api;
}
Run Code Online (Sandbox Code Playgroud)
Web 应用程序的一部分类似于相册。我希望照片由 ngninx 提供以提高性能。我的配置现在看起来像,它可以工作但绕过身份验证:
location /photos {
root /srv/web/photos/;
try_files $uri =404;
}
Run Code Online (Sandbox Code Playgroud)
如何使nginx照片仅提供给经过身份验证的用户?(由 python 应用程序实现的身份验证机制,如上所述)
我正在寻找一种Discord.py使用 rewrite 分支将 REST API 集成到我的. 我想用它aiohttp来处理请求,但我不确定应该采用哪种方法。例如,目标是向 API 发出 GET 请求,该请求将返回机器人所在的公会列表。或者作为另一个示例,POST 请求将要求机器人将给定消息写入特定通道。总的来说,它是关于从网页向机器人发出指令。
我尝试将 aiohttp 应用路由器和运行器放在我的 Discord.py 客户端类中。Web 服务器确实在运行,我创建了一个异步函数来返回机器人所在的公会,但看起来该函数不会接受我在转到http://127.0.0.1/guilds. 从而导致missing 1 required positional argument错误。
import discord
import asyncio
from aiohttp import web
class MyClient(discord.Client):
async def on_ready(self):
print('Logged on as {0}!'.format(self.user))
async def get_guilds(self, request):
response_obj = self.guilds
return web.json_response(response_obj,status=200,content_type='application/json')
app = web.Application()
app.router.add_get('/guilds', get_guilds)
web.run_app(app, port=80)
client = MyClient()
client.run(TOKEN)
Run Code Online (Sandbox Code Playgroud)
此外,aiohttp 服务器不是异步运行的。我希望on_ready(self)运行,但它从来没有。我究竟做错了什么 ?
问题是,RuntimeError: Event loop is closed即使我使用return_when=asyncio.FIRST_COMPLETEDinside ,我也会不断出错await asyncio.wait()。
我的代码:
async def task_manager():
tasks = [grab_proxy() for _ in range(10)]
finished, unfinished = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)
for x in finished:
result = x.result()
if result:
return result
def get_proxy_loop():
loop = asyncio.new_event_loop()
proxy = loop.run_until_complete(task_manager())
loop.close()
return proxy
if __name__ == '__main__':
p = get_proxy_loop()
print(type(p))
print(p)
Run Code Online (Sandbox Code Playgroud)
预期行为:
return_when=asyncio.FIRST_COMPLETED 当第一个结果返回“幕后”时,应该终止所有剩余的任务。
但实际上在返回第一个结果后仍然存在未完成的任务。在我关闭循环get_proxy_loop()并访问__main__这些剩余任务中的结果raise 之后RuntimeError: Event loop is closed。
控制台输出:
<class 'str'>
78.32.35.21:55075 …Run Code Online (Sandbox Code Playgroud) 给定 5 万个网站 url 的列表,我的任务是找出其中哪些是可用的/可访问的。这个想法只是向HEAD每个 URL发送一个请求并查看状态响应。从我听到一个异步方法是要去的地方,现在我使用的是asyncio用aiohttp。
我想出了以下代码,但速度非常糟糕。在我的 10 兆位连接上,1000 个 URL 大约需要 200 秒。我不知道期望的速度是多少,但我是 Python 异步编程的新手,所以我想我在某个地方走错了地方。如您所见,我已尝试将允许的同时连接数增加到 1000(从默认值 100 增加)以及 DNS 解析保留在缓存中的持续时间;都没有什么大的影响。环境有 Python 3.6 和 aiohttp3.5.4。
与问题无关的代码审查也受到赞赏。
import asyncio
import time
from socket import gaierror
from typing import List, Tuple
import aiohttp
from aiohttp.client_exceptions import TooManyRedirects
# Using a non-default user-agent seems to avoid lots of 403 (Forbidden) errors
HEADERS = {
'user-agent': ('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) '
'AppleWebKit/537.36 (KHTML, like …Run Code Online (Sandbox Code Playgroud) aiohttp ×10
python ×6
python-3.x ×5
nginx ×2
coroutine ×1
discord.py ×1
django ×1
docker ×1
kerberos ×1
ssl ×1