簡體   English   中英

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

[英]Embedded Python in C++ socket programming

我不能在發送和接收腳本運行在不同線程中的單個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;

}

提前致謝

我認為這里的問題是,python不是線程安全的。 您不能只從兩個線程訪問解釋器並期望它能工作。 有關更多詳細信息,請參見http://docs.python.org/2/c-api/init.html#non-python-created-threads 本質上,您必須獲取並釋放GIL(全局解釋器鎖)。

這種東西是一種互斥體,可確保每次僅一個線程訪問python對象。 GIL也是python多線程性能普遍較差的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM