我需要发布一系列XML元素(每个调用可能会有不同的数量)。我在Python3.9.1上使用请求v2.25.1。虽然我的解决方案可以工作,但执行大约需要27秒,尽管请求模块显示完成的r.elapsed不到1秒。我已经证实的事情:
r.text编码问题不存在requests.Session()没有提高响应时间当我运行邮递员时,我也看到了不到1秒的结果。我已经将这个问题隔离到我正在运行的for loop中。数据从SQL中提取,存储为变量,然后for循环处理这一过程,并在我的XML请求中运行。
我的问题是,我的下面的代码是否是最佳实践,还是有一种更“毕多尼尼亚”的方式来完成我想要完成的任务?如有任何指导,将不胜感激。
skill_id=[]
agent_state=[]
agent_name=[]
for db_users in db_results:
skill_id.append(db_users[0])
agent_state.append(db_users[1])
agent_name.append(db_users[2])
if db_users[1] == 'NOT_READY':
try:
cursor.execute(sqlskillgroup)
skillgroups = []
for sg_query_result in cursor.fetchall():
sg = sg_query_result[0]
skillgroups.append(sg)
except pyodbc.Error as e:
print("Error retreiving skill group information from database.")
quit()
finally:
connect.close()
icm_url = "https://url_of_post"
xmlfile = open('skill_remove.xml', 'r')
body = xmlfile.read()
icm_header = {
'Content-Type': 'application/xml',
'Authorization': 'Basic Q2hhZF9NZXllckBhamcuY29tOmNpc2Nv',
'Cookie': 'JSESSIONID=0C8456E3901DF7A3A0862E17FD50547D'
}
for sgid in skillgroups:
r = requests.request("POST",icm_url, headers = icm_header,
data = body.format(agent = str(skill_id[0]), skill_urls = '<refURL>/unifiedconfig/config/skillgroup/' + str(sgid) + '</refURL>',),
verify = r"CAchain.pem",
cert = (r"cert.cer", r"cert.key"),
)
print(r.text)
print(r.elapsed)发布于 2021-02-18 15:24:16
看起来,您正在对循环中最后一个请求所用的时间进行计时。您可以通过将r.elapsed移动到循环中并对每个请求进行求和,或者在循环中添加一个正在运行的总计并在末尾打印,从而计算出总运行时间。
total_elapsed = 0
for sgid in skillgroups:
r = requests.request("POST",icm_url, headers = icm_header,
data = body.format(agent = str(skill_id[0]), skill_urls = '<refURL>/unifiedconfig/config/skillgroup/' + str(sgid) + '</refURL>',),
verify = r"CAchain.pem",
cert = (r"cert.cer", r"cert.key"),
)
total_elapsed += r.elapsed基本异步和aiohttp实现
import asyncio
import aiohttp
async def post_request(session, url):
async with session.post() as request: #add your request headers, certificate etc
await request.status
async def main():
async with aiohttp.ClientSession() as session: # use client session to auto close at the end
tasks = []
for url in urls:
t = asyncio.create_task(post_request(session, url)) #create a number of tasks to run concurrently
tasks.append(t)
await asyncio.gather(*tasks) # wait for all tasks to finish before close the session
asyncio.run(main())https://stackoverflow.com/questions/66260878
复制相似问题