第一次尝试asyncio
和aiohttp
。我有以下代码,它们从urls
数据库中获取MySQL
请求。获取响应并将其推送到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()
?
使此代码异步根本不会加快速度。除非您考虑以“并行”方式运行部分代码。例如,您可以在“相同时间”内运行多个(SQL或HTTP)查询。通过执行异步编程,您将不会在“相同时间”内执行代码。尽管您会在等待IO时受益于长时间的IO任务来执行代码的其他部分。
首先,您必须使用asynchronous库(而不是synchronous一个)。
要“并行”执行多个异步任务(例如,替换循环aiohttp,您必须仔细阅读for url in urls_dict:
和函数asyncio tasks。
我不会以异步方式(重新)编写代码,但是以下几行伪代码可以帮助您:
gather