在 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 套接字编程中获取“传输端点未连接”