Python 多线程效率与IPC
我有两个项目: 1) 从两个经纪人处读取财务数据的python脚本。我为此创建了两个线程,并在代码的主要部分留下一个while循环,以便从我的另一个程序中读取指令 < P> 2)我的另一个程序是一个C++程序,它创建1个线程,用于从Python脚本不断读取信息。主函数中的while循环用于下订单Python 多线程效率与IPC,python,c++,multithreading,ipc,Python,C++,Multithreading,Ipc,我有两个项目: 1) 从两个经纪人处读取财务数据的python脚本。我为此创建了两个线程,并在代码的主要部分留下一个while循环,以便从我的另一个程序中读取指令 < P> 2)我的另一个程序是一个C++程序,它创建1个线程,用于从Python脚本不断读取信息。主函数中的while循环用于下订单 我使用命名管道在Python和C++之间进行通信。p> 一切似乎都正常。然而,在C++程序接收信息并通过命名管道将其发送到Python脚本的时间之间存在巨大的延迟。在我的EC2服务器上,将信息从一个地方
我使用命名管道在Python和C++之间进行通信。p> 一切似乎都正常。然而,在C++程序接收信息并通过命名管道将其发送到Python脚本的时间之间存在巨大的延迟。在我的EC2服务器上,将信息从一个地方发送到另一个地方大约需要100毫秒。在我的i5电脑上,这大约需要10毫秒(这仍然很长,我希望是微秒)
我的逻辑怎么了?多线程是否会减慢整个过程?下面是我正在做的一些示例代码(简化代码): Python:os.mkfifo("/tmp/botcmd") # Create pipe
pipecmd = open("/tmp/botcmd", "r")
# This pipe will be used in the threads to send the data to the C++ program
os.mkfifo("/tmp/botdata") # Create pipe
pipe = open("/tmp/botdata", "r")
# Websocket communication
thread.start_new_thread( start_websocket1,() )
thread.start_new_thread( start_websocket2,() )
while 1:
try:
line = pipecmd.readline()
except:
print "Could not read cmd pipe"
print line # It will take at least 10ms to read!!!
C++:
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
无效读取管道(内部参数){
ifstream管道(“/tmp/botdata”);
而(1){
弦线;
管道>>线路;
为什么每次写入都要打开和关闭管道?似乎很昂贵。我注意到您的线程函数被称为websocket
,您是使用套接字还是仅使用管道?我提出这个问题是因为TCP_NODELAY套接字选项在这些情况下很有帮助(但不适用于管道)我应该打开管道吗?我打开和关闭,因为它不会不断地通过命名管道发送数据。而且…我使用WebSoCube读取代理数据。我在Python脚本和C++程序之间使用IPC命名管道。顺便问一下,你知道吉尔的假设吗?不,我不知道Abou.t GIL。事实上,我对多线程相当陌生。这是否意味着在python这样的脚本语言中使用多进程不会提高效率?GIL意味着在某些I/O上阻塞的线程会阻塞整个程序。实际上,这不是很有用。多处理是更好的方法。我还建议您看看zeromq,也就是说一个好的使用管道的包装器,可以在Python和C++中节省大量的编码。
#include <iostream>
#include <cstring>
#include <string>
#include <fstream>
#include <thread>
using namespace std;
void read_pipe(int arg){
ifstream pipe("/tmp/botdata");
while(1){
string line;
pipe >> line;
cout << line << endl;
}
}
void write_pipe(string data){
ofstream pipe("/tmp/botcmd"); // Open the pipe
pipe << data << endl;
pipe.close();
}
int main()
{
thread t1(read_pipe,0);
while(1){
// If I get some x value from python, send this:
write_pipe("This is where I send the data");
}
return 0;
}