202602021508 python如何在将contextVar带到子线程中

202602021508 python如何在将contextVar带到子线程中

import time  
from concurrent.futures import ThreadPoolExecutor  
from contextvars import copy_context, ContextVar  
  
trace_id = ContextVar("trace_id")  
  
def work(x):  
    time.sleep(x)  
    print("trace_id =", trace_id.get(None), "x =", x)  
  
def submit_with_context(pool, fn, *args, **kwargs):  
    ctx = copy_context()  
    return pool.submit(ctx.run, fn, *args, **kwargs)  
  
trace_id.set("REQ-123")  
  
with ThreadPoolExecutor(max_workers=2) as pool:  
    f1 = submit_with_context(pool, work, 1)  
    f2 = submit_with_context(pool, work, 2)  
    f3 = pool.submit(work, 3)  
  
    f1.result()  
    f2.result()  
    f3.result()

会将ContextVar带到子线程中

输出:

trace_id = REQ-123 x = 1
trace_id = REQ-123 x = 2
trace_id = None x = 3

特别适合在做trace的时候,将 contextVar 传到子线程中