gpt4 book ai didi

python - 使用 Python 和 C api 的多线程

转载 作者:太空狗 更新时间:2023-10-29 20:18:32 32 4
gpt4 key购买 nike

我有一个 C++ 程序,它使用 C api 来使用我的 Python 库。Python 库和 C++ 代码都是多线程的。

特别是,C++ 程序的一个线程实例化了一个继承自 threading.Thread 的 Python 对象。我需要我的所有 C++ 线程都能够调用该对象上的方法。

从我第一次尝试开始(我天真地只是从主线程实例化对象,然后等待一段时间,然后调用方法)我注意到与刚创建的对象关联的 Python 线程的执行一旦停止执行返回到 C++ 程序。

如果执行停留在 Python 中(例如,如果我调用 PyRun_SimpleString("time.sleep(5)");)Python 线程的执行在后台继续并且一切正常直到等待结束,执行返回到 C++。

我显然做错了什么。我应该怎么做才能使我的 C++ 和 Python 都成为多线程的并且能够很好地相互协作?我以前没有该领域的经验,所以请不要假设任何事情!

最佳答案

执行您要执行的操作的正确步骤顺序是:

  • 在主线程中:

    1. 使用 Py_Initialize* 初始化 Python。
    2. 使用 PyEval_InitThreads() 初始化 Python 线程支持。
    3. 启动 C++ 线程。

此时,主线程仍然持有GIL。

  • 在 C++ 线程中:
    1. 使用 PyGILState_Ensure() 获取 GIL。
    2. 创建一个新的 Python 线程对象并启动它。
    3. 使用 PyGILState_Release() 发布 GIL。
    4. sleep ,做一些有用的事情或退出线程。

因为主线程持有GIL,所以这个线程会等待获取GIL。如果主线程调用 Python API,它可能会不时释放 GIL,让 Python 线程执行一小会儿。

  • 回到主线程:
    1. 发布 GIL,使线程能够使用 PyEval_SaveThread() 运行
    2. 在尝试使用其他 Python 调用之前,使用 PyEval_RestoreThread() 重新获取 GIL>

我怀疑你错过了最后一步——在主线程中释放 GIL,允许 Python 线程执行。

我在 this link 有一个小而完整的例子.

关于python - 使用 Python 和 C api 的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29595222/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com