import threading from time import sleep,ctime loops=[4,2] class ThreadFunc(object): def __init__(self,func,args,name=''): self.name=name self.func = func self.args=args def __call__(self): self.func(*self.args) def loop(nloop,nsec): print('开始循环',nloop,'在:',ctime()) sleep(nsec) print('结束循环',nloop,'于:',ctime()) def main(): print('程序开始于:',ctime()) threads = [] nloops = range(len(loops)) for i in nloops: t = threading.Thread(target=ThreadFunc(loop,(i,loops[i]),loop.__name__)) #传递一个可调用类的实例 threads.append(t) for i in nloops: threads[i].start() #开始所有的线程 for i in nloops: threads[i].join() #等待所有的线程执行完毕 print('任务完成于:',ctime()) if __name__=='__main__': main() 每一行代码的意思
时间: 2023-07-15 20:10:05 浏览: 97
Python RuntimeError: thread.__init__() not called解决方法
1. `import threading`: 导入 Python 的 `threading` 模块,用于创建线程。
2. `from time import sleep, ctime`: 导入 Python 的 `time` 模块中的 `sleep` 和 `ctime` 函数,用于线程休眠和获取当前时间。
3. `loops=[4,2]`: 定义一个列表 `loops`,其中包含了两个整数 4 和 2。
4. `class ThreadFunc(object):`: 定义一个名为 `ThreadFunc` 的可调用类。
5. `def __init__(self, func, args, name=''):`: 定义 `ThreadFunc` 类的构造函数,接收三个参数:`func` 表示要执行的函数,`args` 表示要传递给函数的参数,`name` 为可选参数,表示线程名称。
6. `self.name = name`: 初始化 `ThreadFunc` 实例的名称属性。
7. `self.func = func`: 初始化 `ThreadFunc` 实例的函数属性。
8. `self.args = args`: 初始化 `ThreadFunc` 实例的参数属性。
9. `def __call__(self):`: 定义 `ThreadFunc` 类的 `__call__` 方法,该方法可以让实例像函数一样被调用。
10. `self.func(*self.args)`: 调用 `ThreadFunc` 实例的函数属性,并将参数属性解包传递给函数。
11. `def loop(nloop, nsec):`: 定义一个名为 `loop` 的函数,接收两个参数:`nloop` 表示循环的编号,`nsec` 表示循环的时长。
12. `print('开始循环', nloop, '在:', ctime())`: 输出循环开始的信息和当前时间。
13. `sleep(nsec)`: 使当前线程休眠 `nsec` 秒。
14. `print('结束循环', nloop, '于:', ctime())`: 输出循环结束的信息和当前时间。
15. `def main():`: 定义一个名为 `main` 的函数。
16. `print('程序开始于:', ctime())`: 输出程序开始的信息和当前时间。
17. `threads = []`: 定义一个空列表 `threads`,用于存放线程对象。
18. `nloops = range(len(loops))`: 生成一个整数序列 `nloops`,包含了 `loops` 列表的长度范围内的所有整数。
19. `for i in nloops:`: 遍历 `nloops` 序列中的每个整数 `i`。
20. `t = threading.Thread(target=ThreadFunc(loop, (i, loops[i]), loop.__name__))`: 创建一个名为 `t` 的新线程,将实例化的 `ThreadFunc` 类作为目标函数,传递 `(i, loops[i])` 作为参数,并将 `loop.__name__` 作为线程名称。
21. `threads.append(t)`: 将新创建的线程对象 `t` 添加到 `threads` 列表中。
22. `for i in nloops:`: 再次遍历 `nloops` 序列中的每个整数 `i`。
23. `threads[i].start()`: 启动 `threads` 列表中第 `i` 个线程。
24. `for i in nloops:`: 第三次遍历 `nloops` 序列中的每个整数 `i`。
25. `threads[i].join()`: 等待 `threads` 列表中第 `i` 个线程执行完毕。
26. `print('任务完成于:', ctime())`: 输出任务完成的信息和当前时间。
27. `if __name__=='__main__':`: 如果当前模块是主程序:
28. `main()`: 调用 `main` 函数,开始执行程序。
阅读全文