gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:37:28 26 4
gpt4 key购买 nike

我不能在发送和接收脚本在不同线程中运行的单个 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多线程性能普遍不好的原因。

关于c++ - C++ 套接字编程中的嵌入式 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16482589/

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