美文网首页
asyncio contextvar

asyncio contextvar

作者: 霡霂976447044 | 来源:发表于2021-11-18 08:49 被阅读0次

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

相关文章

网友评论

      本文标题:asyncio contextvar

      本文链接:https://www.haomeiwen.com/subject/hyaltrtx.html