Python 3.x ZMQ Recv和Recv_字符串的时间问题
下面我使用的代码是一个发布者给我提供数据的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 任何提示或帮助都将是惊人的。提前谢谢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秒。所以这部分不是问题所在 我想知道这会有什么影响。这可能是我电脑的处理能力吗?或者接收字符串是基于它等待发布者实
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')