【问题标题】:Embedded Python in C++ socket programming在 C++ 套接字编程中嵌入 Python
【发布时间】: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;

}

提前致谢

【问题讨论】:

    标签: c++ python multithreading sockets embedding


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      相关资源
      最近更新 更多