Python3多线程任务未运行求助:无法生成并输出词组
排查你的Python多线程代码问题
兄弟,我帮你瞅了下这段代码,发现两个核心问题导致没有输出:
1. 最关键的:你定义了main函数,但从来没调用它!
你看代码最后直接写了print("completed"),但main()函数根本没被执行,那四个线程连创建都没创建,自然啥输出都没有,程序直接就打印完"completed"退出了。
2. 就算调用了main,主线程会提前终止子线程
就算你调用了main函数,主线程启动子线程后会立刻往下走,直接打印"completed"然后退出——Python里主线程结束时,所有子线程会被强制终止,大概率子线程还没来得及读取文件、循环打印就被干掉了。
修复后的完整代码
这里给你改好了,顺便优化了一些细节:
import random from threading import Thread word_file = "words.txt" def gen(words): # 接收传入的单词列表,避免每个线程重复打开文件 for _ in range(1000): print(random.choices(words, k=5)) def main(): # 只读取一次文件,减少IO开销 with open(word_file) as f: words = f.read().splitlines() # 用列表推导式创建4个线程,把单词列表传给每个线程 threads = [Thread(target=gen, args=(words,)) for _ in range(4)] # 启动所有线程 for thread in threads: thread.start() # 等待所有子线程执行完毕,再让主线程继续 for thread in threads: thread.join() # 关键!调用main函数,不然线程根本不会启动 if __name__ == "__main__": main() print("completed")
额外优化建议(可选)
多个线程同时打印可能会导致输出混乱(比如一行里混着好几个线程的结果),如果想要整洁的输出,可以加个打印锁:
import random from threading import Thread, Lock word_file = "words.txt" print_lock = Lock() # 创建一个打印锁 def gen(words): for _ in range(1000): result = random.choices(words, k=5) with print_lock: # 打印前获取锁,避免输出混乱 print(result) def main(): with open(word_file) as f: words = f.read().splitlines() threads = [Thread(target=gen, args=(words,)) for _ in range(4)] for thread in threads: thread.start() for thread in threads: thread.join() if __name__ == "__main__": main() print("completed")
再唠两句
- 你原来代码里的
seed = random.randrange(0,2048)其实没啥必要,random模块在每个线程里会自动初始化不同的随机状态,手动设种子反而可能导致重复的随机序列(如果多个线程碰巧生成了相同的seed)。 - 多线程在Python里因为GIL的限制,CPU密集型任务没法真正并行,但你的任务是IO(读文件)+打印,多线程还是能帮你提升效率的。
内容的提问来源于stack exchange,提问作者pylearning
相关产品推荐
相关产品推荐

