Python 3.x ZMQ Recv和Recv_字符串的时间问题

Python 3.x ZMQ Recv和Recv_字符串的时间问题,python-3.x,pandas,time,zeromq,pyzmq,Python 3.x,Pandas,Time,Zeromq,Pyzmq,下面我使用的代码是一个发布者给我提供数据的ZMQ子版本。它使用计数器告诉我,每隔30秒左右运行写入CSV的时间是30秒和59秒 问题:我现在正在为线程中的所有进程计时。message和message2=socket.recv_string接收字符串需要半秒到20秒的时间。从而导致线程错过我设置的30秒和59秒间隔。这件事昨天没有发生。if语句的其他计时器的时间为.00001秒或0.0秒。所以这部分不是问题所在 我想知道这会有什么影响。这可能是我电脑的处理能力吗?或者接收字符串是基于它等待发布者实

下面我使用的代码是一个发布者给我提供数据的ZMQ子版本。它使用计数器告诉我,每隔30秒左右运行写入CSV的时间是30秒和59秒

问题:我现在正在为线程中的所有进程计时。message和message2=socket.recv_string接收字符串需要半秒到20秒的时间。从而导致线程错过我设置的30秒和59秒间隔。这件事昨天没有发生。if语句的其他计时器的时间为.00001秒或0.0秒。所以这部分不是问题所在

我想知道这会有什么影响。这可能是我电脑的处理能力吗?或者接收字符串是基于它等待发布者实际发送内容的时间吗

我不是在一个开发或生产环境中运行,它不是在一个共享服务器上运行的,比如15个人和它的虚拟用户。零客户。我以前从未遇到过这个问题,在为另一个ZMQ发布/订阅设置的另一个脚本上,我在0.01秒或0.001秒内收到消息,一直到3秒。这更容易管理,但标准是0.01

任何提示或帮助都将是惊人的。提前谢谢

import zmq
import pandas as pd
import time
import threading



df_fills = pd.DataFrame()
df_signal = pd.DataFrame()
second_v = [30,59]
s = 0
m = 0
h = 0
d = 0

def counter():
    global h,s,m,d
    while True:
        s += 1
        #print("Second:{}".format(s))
        if s >=60:
            m +=1
            s = 0
        if m >= 60:
            h += 1
            m = 0
        if h >= 24:
            d += 1
            h = 0     
        #print(s)
        time.sleep(1)


class zmq_thread(threading.Thread):
    def __init__(self,name):
        threading.Thread.__init__(self)
        self.name = name
    def run(self):  
        global df_fills, second_v,s 
        print('zmq started')
        context = zmq.Context()
        socket = context.socket(zmq.SUB)              
        socket.connect(SERVER)        
        socket.setsockopt_string(zmq.SUBSCRIBE,'F')            
        print('socket connected')     
        tickers = [a bunch of tickers] 
        while True:                                 
            try:
                start2 = time.time()                               
                if s == 30:
                    print('break')
                    if df_fills.empty == True:
                       print('running fill thread again')
                       z = zmq_thread('Start_ZMQ') 
                       #time.sleep(.7)
                       z.run()  
                    else:
                        start = time.time()
                        print('writing fills')
                        filename = "a CSV"
                        with open(filename, 'a') as f:
                            df_fills.to_csv(f, encoding = 'utf-8', index = False, header = False)
                            f.close()     
                            print('wrote fills')                                          
                            end = time.time()
                            print(end-start)
                            df_fills = df_fills.iloc[0:0]                    
                            z = zmq_thread('Start_ZMQ') 
                            z.run()                    
                    return df_fills     
                end2 = time.time()
                print(end2-start2) 
                start3 = time.time()
                message = socket.recv_string()
                message2 = socket.recv_string()  
                end3 = time.time()
                print(end3-start3, 'message timing')
                print(s)
                start1 = time.time()
                if message == 'F':
                    # message2_split = message2.split("'")
                    message2_split = message2.split(";")
                    message3_split = [e[3:] for e in message2_split]
                    message4 = pd.Series(message3_split)

                    if message4[0] in tickers:
                        df_fills = df_fills.append(message4, ignore_index=True)
                        print('fill')
                end1 = time.time()
                print(end1-start1)
            except KeyboardInterrupt:
                break              



counter = threading.Thread(target = counter)
zmq_loop = zmq_thread('Start_ZMQ')
#%%


counter.start()
zmq_loop.start()

我没有意识到ZMQ典型的recv_字符串在默认情况下是阻塞的。所以我做了这个

               message = socket.recv_string(flags = zmq.NOBLOCK)
               message2 = socket.recv_string(flags = zmq.NOBLOCK)               
           except zmq.ZMQError as e:               
               if e.errno == zmq.EAGAIN:
                    pass             
           else:     
                if message == 'ABA_BB':
                   message2_split = message2.split(";")
                   message3_split = [e[3:] for e in message2_split]
                   message4 = pd.Series(message3_split)
                   #print(message4)
                   if message4[2] == '300':                        
                       df_signal = df_signal.append(message4, ignore_index=True)               
                       print('Signal Appended')