【问题标题】:Threaded For Loop Function Stuck线程 For 循环功能卡住
【发布时间】:2021-03-26 20:40:52
【问题描述】:

我对 python 比较陌生,所以无法弄清楚为什么我一直挂在启动线程上。下面我正在尝试启动线程,但它挂在ticker=threading.Thread 上。该代码正在使用历史数据模拟交易网络套接字,我沿着线程路线走,而不是正确设置模拟套接字,因为它足以满足我的目的。

ohlcv_strats = ['stratergy 1', 'stratergy 2']
aggregate_strats = ['stratergy 3', 'startergy 4']
if stratergy in ohlcv_strats:
    q = queue.Queue()
    socket = MockSocket(setup, q)
    ticker = threading.Thread(target=socket.ohlcv_ticker(), args=(setup, q), daemon=True)
    ticker.start()
    # ticker result
    ohlcv_ticker = q.get()
elif stratergy in aggregate_strats:
        print('start aggregate ticker')
        

据我所知,它似乎是在我的主线程中启动该函数,所以我被困在 for 循环中并且在调试时无法跨步。

这是我要运行的函数的类

class MockSocket:
    
    def __init__(self, setup, q):
        self.symbol = setup['symbol']
        self.df_ohlcv = setup['df_ohlcv']
        self.df_tick = setup['df_tick']
        self.q = q
    
    def ohlcv_ticker(self):
        # placeholder dict
        ticker_dict = {'e': '24hrTicker',
                    'E': 1615246586071,
                    's': 'ETHBTC',
                    'p': '0.00133400',
                    'P': '3.958',
                    'w': '0.03415149',
                    'x': '0.03370200',
                    'c': '0.03503400',
                    'Q': '0.35100000',
                    'b': '0.03503100',
                    'B': '0.20900000',
                    'a': '0.03503200',
                    'A': '44.84800000',
                    'o': '0.03370000',
                    'h': '0.03511000',
                    'l': '0.03352900',
                    'v': '384222.79900000',
                    'q': '13121.78030909',
                    'O': 1615160185712,
                    'C': 1615246585712,
                    'F': 239943553,
                    'L': 240321960,
                    'n': 378408
                    }
            
        start_time = self.df_ohlcv['time'].iloc[0]
        tf = (self.df_ohlcv['time'] - self.df_ohlcv['time'].shift(1)).dt.total_seconds().bfill().astype(int).iloc[0]
        r_start = self.df_ohlcv[self.df_ohlcv['time'] == start_time].index.tolist()[0]
        
        # for loop over df for ticker
        for i in range(r_start, len(self.df_ohlcv), 1):
            if i > r_start:
                r_start = r_start + 1
            else:
                pass
            o, h, l, c, v = self.df_ohlcv['open'].loc[r_start], self.df_ohlcv['high'].loc[r_start], self.df_ohlcv['low'].loc[r_start], self.df_ohlcv['close'].loc[r_start], self.df_ohlcv['volume'].loc[r_start]
            o, h, l, c, v = '{:.8f}'.format(o), '{:.8f}'.format(h), '{:.8f}'.format(l), '{:.8f}'.format(c), '{:.8f}'.format(v)
            e = (pd.to_datetime(self.df_ohlcv['time'].loc[r_start]) - pd.Timestamp("1970-01-01")) // pd.Timedelta('1ms')
            ticker_dict.update({'o' : o, 'h' : h, 'l' : l, 'c' : c, 'v' : v, 's' : self.symbol.upper(), 'E' : e})
            time.sleep(tf)
            self.q.put(ticker_dict)

我还可以通过其他方式来整理它!这是我的第一个 python 项目。

谢谢!

【问题讨论】:

    标签: python multithreading function class python-multithreading


    【解决方案1】:
    threading.Thread(target=socket.ohlcv_ticker(), args=(setup, q), daemon=True)
    

    这是运行函数socket.ohlcv_ticker(),然后使用结果创建一个线程。线程本身直到函数运行后才会生成。我的猜测是你打算

    threading.Thread(target=socket.ohlcv_ticker, args=(setup, q), daemon=True)
    

    在单独的线程中运行socket.ohlcv_ticker

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-15
      • 1970-01-01
      • 1970-01-01
      • 2021-07-31
      • 2020-03-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-01
      相关资源
      最近更新 更多