所以,基本上我想做个计时器,但是我不想使用thread.Timer
效率
但是我需要为此使用线程。
class Works(object):
def __init__(self):
self.symbol_dict = config.ws_api.get("ASSET_ABBR_LIST")
self.dict = {}
self.ohlcv1m = []
def on_open(self, ws):
ws.send(json.dumps(config.ws_api.get("SUBSCRIPTION_DICT")))
每次收到来自Web套接字服务器的消息时,我都会将其存储在self.dict中
def on_message(self,ws,message):
message = json.loads(message)
if len(message) > 2 :
ticker = message[2]
pair = self.symbol_dict[(ticker[0])]
baseVolume = ticker[5]
timestmap = time.time()
try:
type(self.dict[pair])
except KeyError as e:
self.dict[pair] = []
self.dict[pair].append({
'pair':pair,
'baseVolume' : baseVolume,
})
def run(self):
websocket.enableTrace(True)
ws = websocket.WebSocketApp(
url = config.ws_api.get("WEBSOCK_HOST"),
on_message = self.on_message,
on_open = self.on_open
)
ws.run_forever(sslopt = {"cert_reqs":ssl.CERT_NONE})
'每60秒钟发生一次。计算self.dict并保存到self.ohlcv1m 并将其发送到数据库。最终self.dict和self.ohlcv1m再次初始化,以存储来自服务器的1分钟数据。
def every60s(self):
threading.Timer(60, self.every60s).start()
for symbol in self.dict:
tickerLists = self.dict[symbol]
self.ohlcv1m.append({
"V": sum([
float(ticker['baseVolume']) for ticker in tickerLists]
})
#self.ohlcv1m will go to database every 1m
self.ohlcv1 = [] #init again
self.dict = {} #init again
if __name__ == "__main__":
work=Works()
t1 = threading.Thread(target=work.run)
t1.daemon = True
t1.start()
work.every60s()
(对不起,缩进)
在python27中有没有办法使60s没有线程?
如果您给我任何建议,我将非常感谢您的答复。 谢谢
答案 0 :(得分:1)
答案是:您是否需要代码每60秒准确运行一次,或者您是否可以等待两次运行之间60秒(即,如果逻辑花费5秒,则每65秒运行一次)。
如果您对两次跑步之间只有60秒的间隔感到满意,则可以这样做
hadoop fs -mkdir -p hdfs:///user/$(whoami)
如果您真的不使用线程,而是每60秒启动一次,而不管上次轮询时间如何,那么您可以对上一次执行计时,并将其从60秒中减去以获取睡眠时间。
但是,实际上,有了那里的代码,您就不会遇到您可能已经了解的Python线程问题。当您同时运行多个线程且所有CPU受限制时,就会出现这些问题,除非您提供的代码中没有进行一些非常缓慢的,占用大量CPU的工作,否则在这里似乎不是这种情况。>