Python线程场景下与C++ std::future/std::promise等价的实现是什么?
核心方案:使用
concurrent.futures.Future Python标准库内置的concurrent.futures.Future就是多线程场景下完全等价于C++std::future/std::promise的实现,和asyncio场景的Future完全独立,原生适配你的多线程回调需求:
- 封装
wrap_xxx时创建Future实例,等价于同时创建了C++中关联的promise和future对象 - 在PJSUA2工作线程的异步回调中调用
set_result(返回值)/set_exception(异常对象),等价于C++中promise::set_value/promise::set_exception - 调用侧拿到Future实例后调用
result(timeout=None),等价于C++中future::get(),会阻塞到结果返回/超时,且天生支持多个Future同时处于待返回状态,不会互相干扰
封装与调用示例
封装wrap_xxx函数代码
from concurrent.futures import Future import pjsua2 as pj def wrap_foo(param1, param2): # 创建Future实例,线程安全 fut = Future() # 定义适配PJSUA2的回调类 class FooCallback(pj.Call): def on_operation_complete(self, res): # 工作线程回调中写入结果 fut.set_result(res) def on_operation_fail(self, err_code, err_msg): # 异常场景写入错误,调用侧拿结果时会自动抛出 fut.set_exception(RuntimeError(f"PJSUA2 error: {err_code}, {err_msg}")) # 调用原生PJSUA2接口,传入回调实例 cb = FooCallback() pj.foo(param1, param2, cb) # 直接返回Future,不会阻塞当前线程 return fut
调用侧代码(和你预期的写法完全一致)
# 单调用校验场景 future = wrap_foo("test", 123) if future.result() != expected_result: raise Exception("result mismatch") # 多调用并行场景 future1 = wrap_foo("a", 456) future2 = wrap_bar("b", 789) # 可选:批量等待所有future返回 from concurrent.futures import as_completed for finished_fut in as_completed([future1, future2]): res = finished_fut.result() # 处理对应返回结果
注意事项
- 需要超时控制时直接给
result()传超时参数即可,例如future.result(timeout=10),超时会抛出TimeoutError,逻辑和C++std::future::wait_for完全一致 concurrent.futures.Future天生线程安全,不需要额外加锁处理回调线程和主线程的并发读写
内容的提问来源于stack exchange,提问作者user14180995
相关产品推荐
相关产品推荐

