在 C++ 套接字编程中嵌入 Python

Posted

技术标签:

【中文标题】在 C++ 套接字编程中嵌入 Python【英文标题】:Embedded Python in C++ socket programming 【发布时间】:2013-05-10 12:45:44 【问题描述】:

我不能在单个 python 嵌入式 C++ 程序中发送和接收 UDP 数据包,其中发送和接收脚本在不同的线程中运行? 运行 exe 文件时出现未处理的异常。当发送或接收命令之一被注释掉,即 PyRun_SimpleString(sendPy) 或 PyRun_SimpleString(recPy) 时,程序一切正常。 这里有什么错误?

代码如下:

DWORD WINAPI sendPack(LPVOID iValue)



while(1)

   const char* sendPy = "UDPSockSend.sendto('10707',('10.107.35.167',21567))";
   PyRun_SimpleString(sendPy);

    
return 0;



DWORD WINAPI receive(LPVOID iValue)


while(1)

    Py_Initialize();
    recPy = "data,addr = UDPSockRcv.recvfrom(99000)";          
    PyRun_SimpleString(recPy);



return 0;



int threads()    


    HANDLE sendPackThread, receiveThread; 
    DWORD dwGenericThread;     

    char lszThreadParam[4]; 

    receiveThread = 
    CreateThread(NULL,0,receive,&lszThreadParam,0,&dwGenericThread);          
    if(receiveThread == NULL)           
        DWORD dwError = GetLastError();           
        return 0;     
    



    sendPackThread =     
    CreateThread(NULL,0,sendPack,&lszThreadParam,0,&dwGenericThread);     
        if(sendPackThread == NULL)           
        DWORD dwError = GetLastError();           
        std::cout<<"SCM:Error in Creating send sample thread"<<dwError<<"\n" ;       
        return 0;     
        

    return 1;



int main(int argc, char* argv[])


    using namespace std;
    Py_Initialize();

    const char * initPy = "import socket; 
    UDPSockSend = socket.socket(socket.AF_INET,socket.SOCK_DGRAM); 
    UDPSockRcv = socket.socket(socket.AF_INET,socket.SOCK_DGRAM);
    listen_addr = ('',2000);UDPSockRcv.bind(listen_addr)";
    PyRun_SimpleString(initPy);


    int thd = threads();

    system("pause");
    return 0;


提前致谢

【问题讨论】:

【参考方案1】:

我认为这里的问题是,python 不是线程安全的。您不能只从两个线程访问解释器并期望它可以工作。有关详细信息,请参阅http://docs.python.org/2/c-api/init.html#non-python-created-threads。本质上,您必须获取和释放 GIL(全局解释器锁)。

这东西是一种互斥体,可以确保一次只有一个线程访问 python 对象。 GIL也是python多线程性能普遍不好的原因。

【讨论】:

以上是关于在 C++ 套接字编程中嵌入 Python的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中的 UDP 套接字编程中获取“传输端点未连接”

将数据从 Python 程序发送到 C++ 程序的策略

套接字编程 C++ setsockopt()

套接字编程:在 UDP 上发送数据包(C++)

在嵌入式linux上使用python可以套接字,绑定行为不端

在Java窗口中嵌入c++ opengl窗口