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

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')

锁使用补充说明

如果后续需要操作共享变量用到锁,按照如下方式调整即可,避免命名冲突:

  1. 实例化锁对象:lock = Lock()
  2. 修改worker函数新增小写命名的lock形参:def worker(q, lock):
  3. 创建线程时传入锁对象:thread = Thread(target=worker, args=(q, lock))
  4. 操作共享资源的逻辑用with lock:包裹保证线程安全。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:57:02