Python 3.9运行多线程代码报错无法导入time和Lock,如何解决?
问题解决步骤
- 参数传递错误:你定义的
worker函数要求传入q和Lock两个参数,但创建线程时Thread(target=worker)没有通过args传递对应参数,运行时会直接抛出参数缺失错误。 - 命名冲突问题:你将从
threading模块导入的Lock类名直接用作了worker的形参名,会覆盖掉当前作用域内对Lock类的引用,导致后续如果要实例化锁的时候找不到正确的类,也就是你说的无法识别Lock类的报错来源。 import time识别异常的排查方向:你现有代码完全没有调用time模块的相关方法,正常不会报错。如果提示无法识别time,优先检查当前工作目录下是否存在名为time.py的自定义文件,会和Python标准库的time模块重名冲突,重命名自定义文件即可解决。
修正后可正常运行的代码
修改点说明:删除worker函数多余的Lock参数(现有逻辑不需要锁,若需要加锁可以单独实例化锁对象,用小写名称避免和类名重名);创建线程时传入队列参数。
from threading import Thread, Lock, current_thread from queue import Queue import time def worker(q): while True: value = q.get() # 模拟处理耗时的场景可以调用time模块方法,示例:time.sleep(0.1) print(f'in {current_thread().name} got {value}') q.task_done() if __name__ == "__main__": q = Queue() num_threads = 10 for i in range(num_threads): # 新增args参数,传入队列对象 thread = Thread(target=worker, args=(q,)) thread.daemon=True thread.start() for i in range(1, 21): q.put(i) q.join() print('end main')
锁使用补充说明
如果后续需要操作共享变量用到锁,按照如下方式调整即可,避免命名冲突:
- 实例化锁对象:
lock = Lock() - 修改worker函数新增小写命名的lock形参:
def worker(q, lock): - 创建线程时传入锁对象:
thread = Thread(target=worker, args=(q, lock)) - 操作共享资源的逻辑用
with lock:包裹保证线程安全。
内容的提问来源于stack exchange,提问作者Isaiah Daniels
相关产品推荐
相关产品推荐

