- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我最近一直在玩 asyncio 模块。下面是我想出的用于发送一些并行请求的代码,这些请求在我的笔记本电脑 (Mac OS) 上似乎运行良好,但在另一台机器 (Ubuntu 18.04) 上似乎运行缓慢。在它运行缓慢的机器(Ubuntu 18.04)中,我安装了 virtualbox vm,其中又安装了 Ubuntu 18.04,令我惊讶的是,代码似乎在那里运行得非常好。我在 Ubuntu 机器上有多个版本的 python,我试图用 3.7.2 运行它。我不确定如何在这里缩小问题范围。如果有人可以帮助我,那就太好了。
我确定这不是网络问题。在 Ubuntu 物理机中,这段代码需要大约 130 秒才能完成。但在 Ubuntu VM 中,它按预期工作,只需不到 5 秒。
import aiohttp
import asyncio
import ssl
import time
from bs4 import BeautifulSoup
async def get_app_updated_date(html_content):
soup = BeautifulSoup(html_content, 'lxml')
section_titles_divs = [x for x in soup.select('div.hAyfc div.BgcNfc')]
title_normalization = {
'Updated': 'updated',
}
data = {
'updated': None,
}
for title_div in section_titles_divs:
section_title = title_div.string
if section_title in title_normalization:
title_key = title_normalization[section_title]
value_div = title_div.next_sibling.select_one('span.htlgb')
value = value_div.text
data[title_key] = value
return data
async def fetch(session, url, app_id):
print(f'Fetching information for {app_id}')
async with session.get(url, params={'id': app_id}, ssl=ssl.SSLContext()) as response:
html_resp = await response.text()
app_lastupdated_date = await get_app_updated_date(html_resp)
return {app_id: app_lastupdated_date}
async def main():
url = 'https://play.google.com/store/apps/details'
app_list = ['com.google.android.youtube',
'com.whatsapp',
'com.instagram.android',
'com.google.android.apps.maps',
'com.kiloo.subwaysurf',
'com.halfbrick.fruitninjafree',
'com.adobe.reader',
'org.mozilla.firefox',
'com.zeptolab.ctr.ads',
'com.fingersoft.hillclimb']
async with aiohttp.ClientSession() as session:
url_requests = [fetch(session, url, app_id) for app_id in app_list]
print(url_requests)
results = await asyncio.gather(*url_requests)
for r in results:
print(r)
print(f'Result size = {len(results)}')
if __name__ == '__main__':
start_time = time.time()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
print(f'Script execution completed in: {time.time() - start_time} seconds')
更新:根据建议,附上我的分析报告。无法理解行话。再次,在此论坛中寻求人们的专业知识。
最佳答案
我建议您至少缩小到函数范围。使用 profiling IDE 中的模块或分析器(即 Pycharm 提供了非常好的工具)以了解有问题的功能。
但是 IMO,这实际上看起来像是网络问题,因为在裸机上的 Ubuntu 下运行是:
VM 中的 Ubuntu 是:
关于python - 如何调试异步 aiohttp 缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54439711/
我想要一个类似于 django runserver 所做的重新加载。 如果我更改 python 文件,我希望应用程序重新加载。我已经安装了 aiohttp-devtools 并使用 adev runs
我在使用 RouteTableDef 时遇到问题。 有一些项目的路由结构如下: 1) 有文件route.py。 路线.py from aiohttp import web routes = web.R
我有一些代码对某些 API 进行请求序列。我想为所有人设置通用日志记录,我该如何设置? 假设我的代码是这样的 import aiohttp import asyncio async def fetch
您能否就以下方面提出建议? 在 localhost:8900 上有 aiohttp 服务器在运行 当我从 python 发出类似(使用 python2 模块请求)的请求时 requests.get("
每当我对使用 asyncio 和 aiohttp 访问的 API 执行超过 200 个请求时,我都会收到 aiohttp client_exception.ServerDisconnectedErro
在我正在开发的爬虫中。它使用 pycurl multi 发出请求。 如果我改用aiohttp,我可以期待什么样的效率提升? 怀疑让我怀疑潜在的改进,因为 python 有 GIL。大部分时间都花在等待
我在尝试使用 azure 测试聊天机器人时遇到一些问题: 我使用 github actions 在 azure web 应用程序上部署了我的机器人,一切都很顺利。但是当我尝试测试我的聊天机器人时,没有
我在尝试使用 azure 测试聊天机器人时遇到一些问题: 我使用 github actions 在 azure web 应用程序上部署了我的机器人,一切都很顺利。但是当我尝试测试我的聊天机器人时,没有
我想知道如何从 aiohttp post 方法获取当前的上传步骤。通常我会使用 get 方法在循环中拉取当前步骤,但如果主机不响应当前上传步骤,这将不起作用。那么有可能得到当前步骤吗?诸如“从 xx%
我目前正在用 aiohttp 做我的第一个“婴儿学步” (来自 requests 模块)。 我尝试稍微简化请求,这样我就不必在主模块中为每个请求使用上下文管理器。 因此我尝试了这个: async de
tl;dr:如何最大化可以并行发送的 http 请求数量? 我正在使用 aiohttp 库从多个网址获取数据。我正在测试它的性能,并且观察到该过程中的某个地方存在瓶颈,一次运行更多的网址并没有帮助。
目前我正在执行以下操作来获取当前正在运行的应用程序 async def handler(request): app = request.app 是否有其他方法来获取当前正在运行的应用程序?考虑
首先是代码: import random import asyncio from aiohttp import ClientSession import csv headers =[] def ext
我的 aiohttp 中间件获取函数作为参数,而不是已传递给路由的绑定(bind)方法。如何解释这种行为?如何避免这种情况? class AsyncHttpServer: def __init
我正在尝试在 aiohttp 处理程序中启动后台长时间任务: from aiohttp import web import time import asyncio async def one(requ
我正在测试 aiohttp 和 asyncio。我希望相同的事件循环具有套接字、http 服务器、http 客户端。 我正在使用此示例代码: @routes.get('/') async def he
#!/usr/bin/env python3.5 import asyncio import aiohttp url = "http://eniig.dk" async def main():
考虑以下代码: from aiohttp_mako import template def authorize(): def wrapper(func): @asyncio.c
我正在编写一个网络爬虫,它为许多不同的域运行并行提取。我想限制每秒向每个单独的域发出的请求数,但我不关心打开的连接总数或每秒的总请求数跨越所有领域。 我想最大限度地提高打开的连接数和每秒请求数,同时限
我需要将 sub_app 添加到 sub_app。这是我的代码 app = web.Application() subapp = web.Application() subapp.router.add
我是一名优秀的程序员,十分优秀!