如何通过Threading实现股票模拟函数在后台持续运行?
解决股票模拟器后台持续运行+菜单交互的问题
我来帮你搞定这个问题!你之前用threading没成功,大概率是因为原来的函数只执行了一轮就结束了,而且没处理好后台线程和主菜单的协同逻辑。下面是调整后的完整实现,一步步给你说明:
第一步:导入必要模块
先确保把需要的模块都导入进来:
import threading import random import time
第二步:修改后台股票波动函数
把原来的函数改成无限循环持续运行的版本,直接修改传入的股票列表(因为列表是可变对象,线程内的修改会同步到主程序):
def stockPriceRandomiser(stockPrices): while True: # 无限循环,持续模拟波动 for i in range(len(stockPrices)): ran_num = random.randint(0, 1) if ran_num == 0: loss = random.randint(90, 99) / 100 stockPrices[i] = round(stockPrices[i] * loss, 2) # 保留两位小数更贴合真实股价 else: profit = random.randint(101, 110) / 100 stockPrices[i] = round(stockPrices[i] * profit, 2) time.sleep(20) # 每20秒完成一轮股价波动
第三步:实现用户交互菜单
做一个简单的菜单,让用户可以随时查看当前股价、退出程序:
def show_menu(stockPrices): while True: print("\n===== 股票模拟器菜单 =====") print("1. 查看当前所有股票价格") print("2. 退出程序") choice = input("请输入你的选择(1/2):") if choice == "1": print("\n当前股票价格:") for idx, price in enumerate(stockPrices, 1): print(f"股票{idx}: ${price}") elif choice == "2": print("程序已退出!") break else: print("输入无效,请重新选择!")
第四步:启动后台线程+运行主菜单
在主程序里启动后台线程,设置为守护线程,然后运行菜单逻辑:
if __name__ == "__main__": stockPrices = [79, 45, 1233, 67, 54, 5000, 7000, 6974] # 创建后台线程,传入波动函数和股票列表参数 stock_thread = threading.Thread(target=stockPriceRandomiser, args=(stockPrices,), daemon=True) stock_thread.start() # 启动后台线程 # 运行主菜单,这是主线程的核心任务 show_menu(stockPrices)
关键细节说明
- 守护线程:设置
daemon=True后,当用户选择退出菜单时,后台线程会自动终止,不用手动处理线程停止的问题。 - 列表的可变性:因为直接传入了
stockPrices列表,线程内对它的修改会实时反映到主程序中,用户查看菜单时能看到最新的股价。 - 无限循环:后台函数用
while True实现持续运行,每20秒遍历所有股票调整价格,完全符合你模拟随机波动的需求。
你可以直接运行这段代码,后台会自动持续更新股价,同时你可以通过菜单随时查看最新价格,选择退出时程序会完全终止。
内容的提问来源于stack exchange,提问作者Oliver Frost
相关产品推荐
相关产品推荐

