Python27是否可以在没有thread.Timer的情况下创建计时器?

时间:2018-06-21 02:40:05

标签: multithreading python-2.7 websocket

所以,基本上我想做个计时器,但是我不想使用thread.Timer 效率

  • Python自己生成线程,效率不高,最好不要使用它。 我搜索与此相关的文章。并检查了使用线程的速度。 例如,将单个进程划分为N个,并使其工作在Thread中,这比较慢。

但是我需要为此使用线程。

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()

(对不起,缩进)

  1. 我正在通过运行run_forever()并获取实时数据来连接套接字
  2. 每60秒钟我需要检查并计算一次数据

在python27中有没有办法使60s没有线程?

如果您给我任何建议,我将非常感谢您的答复。 谢谢

1 个答案:

答案 0 :(得分:1)

答案是:您是否需要代码每60秒准确运行一次,或者您是否可以等待两次运行之间60秒(即,如果逻辑花费5秒,则每65秒运行一次)。

如果您对两次跑步之间只有60秒的间隔感到满意,则可以这样做

hadoop fs -mkdir -p hdfs:///user/$(whoami)

如果您真的不使用线程,而是每60秒启动一次,而不管上次轮询时间如何,那么您可以对上一次执行计时,并将其从60秒中减去以获取睡眠时间。

但是,实际上,有了那里的代码,您就不会遇到您可能已经了解的Python线程问题。当您同时运行多个线程且所有CPU受限制时,就会出现这些问题,除非您提供的代码中没有进行一些非常缓慢的,占用大量CPU的工作,否则在这里似乎不是这种情况。