【发布时间】:2020-04-30 18:26:24
【问题描述】:
第一次尝试asyncio 和aiohttp。
我有以下代码从MySQL 数据库中获取urls 以获取GET 请求。获取响应并将它们推送到MySQL 数据库。
if __name__ == "__main__":
database_name = 'db_name'
company_name = 'company_name'
my_db = Db(database=database_name) # wrapper class for mysql.connector
urls_dict = my_db.get_rest_api_urls_for_specific_company(company_name=company_name)
update_id = my_db.get_updateid()
my_db.get_connection(dictionary=True)
for url in urls_dict:
url_id = url['id']
url = url['url']
table_name = my_db.make_sql_table_name_by_url(url)
insert_query = my_db.get_sql_for_insert(table_name)
r = requests.get(url=url).json() # make the request
args = [json.dumps(r), update_id, url_id]
my_db.db_execute_one(insert_query, args, close_conn=False)
my_db.close_conn()
这很好用,但要加快速度 我怎样才能运行它asynchronously?
这是我根据@Raphael Medaer 的回答尝试过的。
async def fetch(url):
async with ClientSession() as session:
async with session.request(method='GET', url=url) as response:
json = await response.json()
return json
async def process(url, update_id):
table_name = await db.make_sql_table_name_by_url(url)
result = await fetch(url)
print(url, result)
if __name__ == "__main__":
"""Get urls from DB"""
db = Db(database="fuse_src")
urls = db.get_rest_api_urls() # This returns list of dictionary
update_id = db.get_updateid()
url_list = []
for url in urls:
url_list.append(url['url'])
print(update_id)
asyncio.get_event_loop().run_until_complete(
asyncio.gather(*[process(url, update_id) for url in url_list]))
process 方法出现错误:
TypeError: object str can't be used in 'await' expression
不确定是什么问题?
任何特定于此的代码示例都将受到高度赞赏。
【问题讨论】:
-
尝试
commit所有查询和execute仅一次。 -
感谢@Frank 任何代码
fragments将不胜感激? -
对不起,我真的忘了怎么做。我之前也遇到过同样的问题,我只记得我所做的是追加所有查询并一次发送到服务器。
标签: python python-asyncio aiohttp