contextvar类似于多线程的thread.local
不使用contextvar
import asyncio
# declare context var
import random
class Data(object):
def __init__(self):
self.item = None
def set(self, item):
self.item = item
def get(self):
return self.item
request_id = Data()
async def some_inner_coroutine(req_id):
# get value
await asyncio.sleep(random.uniform(0, 1))
print('Processed inner coroutine of request[req_id]: {}'.format(req_id, request_id.get()))
async def some_outer_coroutine(req_id):
# set value
request_id.set(req_id)
await some_inner_coroutine(req_id)
# get value
print('Processed outer coroutine of request: {}'.format(request_id.get()))
async def main():
tasks = []
for req_id in range(1, 5):
tasks.append(asyncio.create_task(some_outer_coroutine(req_id)))
await asyncio.gather(*tasks)
if __name__ == '__main__':
asyncio.run(main())
结果
Processed inner coroutine of request[req_id]: 4
Processed outer coroutine of request: 4
Processed inner coroutine of request[req_id]: 1
Processed outer coroutine of request: 4
Processed inner coroutine of request[req_id]: 2
Processed outer coroutine of request: 4
Processed inner coroutine of request[req_id]: 3
Processed outer coroutine of request: 4
使用contextvar
import asyncio
import contextvars
# declare context var
import random
request_id = contextvars.ContextVar('Id of request.')
async def some_inner_coroutine(req_id):
# get value
await asyncio.sleep(random.uniform(0, 1))
print('Processed inner coroutine of request[req_id]: {}'.format(req_id, request_id.get()))
async def some_outer_coroutine(req_id):
# set value
request_id.set(req_id)
await some_inner_coroutine(req_id)
# get value
print('Processed outer coroutine of request: {}'.format(request_id.get()))
async def main():
tasks = []
for req_id in range(1, 5):
tasks.append(asyncio.create_task(some_outer_coroutine(req_id)))
await asyncio.gather(*tasks)
if __name__ == '__main__':
asyncio.run(main())
结果
Processed inner coroutine of request[req_id]: 3
Processed outer coroutine of request: 3
Processed inner coroutine of request[req_id]: 1
Processed outer coroutine of request: 1
Processed inner coroutine of request[req_id]: 4
Processed outer coroutine of request: 4
Processed inner coroutine of request[req_id]: 2
Processed outer coroutine of request: 2
网友评论