【发布时间】:2018-02-10 18:50:07
【问题描述】:
我正在尝试测量 python 异步函数的执行时间。但我遇到了问题,因为函数启动的实际时间点是未知的。
测量功能代码:
def timer(func):
async def process(func, *args, **params):
if asyncio.iscoroutinefunction(func):
print('this function is a coroutine: {}'.format(func.__name__))
return await func(*args, **params)
else:
print('this is not a coroutine')
return func(*args, **params)
async def helper(*args, **params):
print('{}.time'.format(func.__name__))
start = datetime.datetime.now()
print(start)
result = await process(func, *args, **params)
finish = datetime.datetime.now()
print('>>> calculated - ', finish - start, 'start-', start, 'finish-', finish)
return result
return helper
休息代码:
@timer
async def fetch(name, session):
url = 'http://localhost:8808/'
payload = {}
async with session.put(url, headers=HEADERS, json=payload) as response:
session.get_connection_count()
response_data = await response.read()
result = {'response_code': response.status,
'response_data': response_data}
return result
def on_data_received(future):
# pass
response_obj = json.loads(future.result()['response_data'])
response_code = future.result()['response_code']
device_id = response_obj.get('clientDeviceID')
async def run(r):
connector = DecoratedTCPConnector(limit_per_host=10000, limit=20000)
with TimedClientSession(connector=connector) as client:
for i in range(r):
id = ''.join([random.choice('01234') for x in range(16)])
task = asyncio.ensure_future(fetch(id, client))
task.add_done_callback(on_data_received)
tasks.append(task)
return await asyncio.gather(*tasks)
开始时间其实是例行任务加入队列的时间,但是我需要发送PUT请求的时间。
欢迎提出任何建议。
【问题讨论】:
标签: python-3.x async-await python-asyncio measurement aiohttp