You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类的__init__方法中线程无法启动的问题求助

问题分析与解决

核心问题1:线程创建方式错误

你创建线程时直接调用了populate_orderbook(self, 10),这会导致主线程先执行完这个函数,再创建线程,而target实际接收的是函数执行后的返回值(这里是None),所以线程根本没触发目标函数。

正确的写法是把函数对象传给target,参数通过args元组传递:

threading.Thread(target=populate_orderbook, args=(self, 10)).start()

核心问题2:循环无限执行

populate_orderbook里的while i < n循环没有递增i,会导致无限循环,永远不会执行到最后的打印语句,看起来像是线程没工作。需要在循环内添加i += 1:

def populate_orderbook(orderbook_instance, n):
    order_type = ['Limit']
    side = ['Buy', 'Sell']

    i = 1
    while i < n:
        # Create random order
        order_obj = Order(
            order_type=order_type[0],
            side=random.choice(side),
            price=random.randint(1, 1000),
            power=random.randint(1, 1000),
        )
        orderbook_instance.add(order_obj)
        i += 1  # 必须添加这行,否则循环永不结束
    print(f'Orderbook prepopulated..')

修正后的完整__init__方法

class OrderBook:
    def __init__(self, bids=None, asks=None):
        if asks is None:
            asks = []
        if bids is None:
            bids = []
        self.bids = sortedcontainers.SortedList(bids, key=lambda order: -order.price)
        self.asks = sortedcontainers.SortedList(asks, key=lambda order: order.price)

        # 修正线程创建方式
        threading.Thread(target=populate_orderbook, args=(self, 10)).start()
        print(f'Orderbook initialized..')

额外注意事项

  • 如果Order类或add方法有问题,也可能导致线程无输出,需要确保这两部分逻辑正常。
  • 线程启动后是后台执行的,主线程如果退出会直接终止所有后台线程,所以如果你的程序初始化后立刻结束,需要让主线程等待线程完成(比如用join()),或者保持程序运行。

内容的提问来源于stack exchange,提问作者JSRB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:35:25