Python 多线程效率与IPC

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服务器上,将信息从一个地方

我有两个项目:

1) 从两个经纪人处读取财务数据的python脚本。我为此创建了两个线程,并在代码的主要部分留下一个while循环,以便从我的另一个程序中读取指令

< P> 2)我的另一个程序是一个C++程序,它创建1个线程,用于从Python脚本不断读取信息。主函数中的while循环用于下订单

我使用命名管道在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;
}