嵌入式的C++套接字编程中的Python

2024-09-28 19:07:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我不能在一个Python嵌入式C++程序中发送和接收UDP包,其中发送和接收脚本在不同线程中运行吗? 运行exe文件时出现未处理的异常。当send或receive命令中的一个被注释掉时,即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;

}

提前谢谢


Tags: returnsocketpyrunnullintreceiveaddrchar
1条回答
网友
1楼 · 发布于 2024-09-28 19:07:18

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

这是一种互斥体,它确保一次只有一个线程访问python对象。GIL也是python多线程性能普遍较差的原因。在

相关问题 更多 >