Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Python27能制作没有线程的计时器吗?计时器?_Multithreading_Python 2.7_Websocket - Fatal编程技术网

Multithreading Python27能制作没有线程的计时器吗?计时器?

Multithreading Python27能制作没有线程的计时器吗?计时器?,multithreading,python-2.7,websocket,Multithreading,Python 2.7,Websocket,所以,基本上我想做一个计时器,但我不想用thread.timer 效率 Python自己生成线程,效率不高,最好不要使用它。 我搜索与此相关的文章。并检查了使用线程的速度是否较慢。 e、 g)将单个进程划分为N个,并使其工作为线程,速度较慢 然而,我需要使用线程 class Works(object): def __init__(self): self.symbol_dict = config.ws_api.get("ASSET_ABBR_LIST") self.dict

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

  • Python自己生成线程,效率不高,最好不要使用它。 我搜索与此相关的文章。并检查了使用线程的速度是否较慢。 e、 g)将单个进程划分为N个,并使其工作为线程,速度较慢
然而,我需要使用线程

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 并将其发送给db。最终,self.dict和self.ohlcv1m再次初始化,以存储来自服务器端的1min数据

    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()
(对不起,这是个缩进)

  • 我通过运行run_forever()并获取实时数据连接到套接字
  • 每隔60秒我需要检查和计算数据
  • 有没有办法在python27中制作没有螺纹的60年代

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

    答案归结为您是否需要代码每60秒运行一次,或者您是否可以在两次运行之间等待60秒(即,如果逻辑需要5秒,它将每65秒运行一次)

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

    import time
    
    while True:
        every60s()
        time.sleep(60)
    
    如果您真的决定不使用线程,而是让它每60秒启动一次,而不考虑最后一次轮询时间,那么您可以计算最后一次执行的时间,并从60秒中减去该时间以获得睡眠时间


    然而,实际上,使用您已经获得的代码,您不会遇到您可能已经阅读过的Python线程的任何问题。当您有多个线程同时运行且所有CPU受限时,就会出现这些问题,这里的情况似乎不是这样,除非有一些非常慢的线程,您提供的代码中没有CPU密集型工作。

    当工作不受IO限制时,Python中的线程会有一些低效,但对于您在这里得到的代码,您似乎试图过早地优化这一不必要的任务。我刚刚添加了更多的代码。这是我第一次在这里提问,所以请原谅我@格里斯谢谢你的解释!所以实际上我代码中的线程问题并不重要。因为我不使用多线程?