Python Thread报错TypeError:如何解决Event参数非可迭代问题?
问题描述
我用Thread和Event做线程实验,代码目标是当变量i为5或10时打印15-20的随机数,其余情况打印0。但运行时触发TypeError错误,提示__main__.generate_num() argument after * must be an iterable, not Event。
原代码
from threading import Thread, Event import queue import random def generate_num(e): print('e',e.is_set()) while True: if e.is_set(): print('g', random.randint(15, 20)) else: print('g', 0) def start_generating(): i = 0 e = Event() r_thread = Thread(target=generate_num, args=(e), daemon=True).start() print('starting') while True: print('i', i) if i %5 == 0: e.set() if i ==12: exit(0) i+=1 start_generating()
错误信息
starting i 0 i 1 i 2 Exception in thread Thread-6 (generate_num): Traceback (most recent call last): i 3 i 4 i 5 i 6 i 7 i 8 i 9 File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner i 10 self.run() File "/usr/lib/python3.10/threading.py", line 953, in run 11 self._target(*self._args, **self._kwargs) TypeError: __main__.generate_num() argument after * must be an iterable, not Event i 12
问题原因与解决
核心错误原因
Thread类的args参数要求传入可迭代对象(比如元组),但你写的args=(e)并不是元组——括号在这里仅作为优先级符号,Python会把它解析成单个Event对象。线程启动时会尝试用*解包args参数,把Event当成可迭代对象遍历,自然抛出类型错误。
修复步骤
- 修正参数传递:把
args=(e)改成args=(e,),添加逗号让Python识别这是一个包含单个元素的元组。 - 修正逻辑偏差:原代码中
i%5==0会匹配i=0、5、10,不符合你“仅i为5或10时打印随机数”的需求,要改成if i in (5,10)。 - 重置事件状态:原代码中设置Event后没有重置,导致i=5之后Event一直处于激活状态,后续所有情况都会打印随机数。需要在打印随机数后调用
e.clear()重置事件。
修正后的代码
from threading import Thread, Event import random def generate_num(e): print('e', e.is_set()) while True: if e.is_set(): print('g', random.randint(15, 20)) # 打印后立即重置事件,避免持续输出随机数 e.clear() else: print('g', 0) def start_generating(): i = 0 e = Event() # 修正args参数为元组 r_thread = Thread(target=generate_num, args=(e,), daemon=True) r_thread.start() print('starting') while True: print('i', i) if i in (5, 10): # 精准匹配i=5或10的情况 e.set() if i == 12: exit(0) i += 1 start_generating()
内容的提问来源于stack exchange,提问作者Vishak Raj
相关产品推荐
相关产品推荐

