You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 16:30:01