具有可变类型参数的多线程函数

weixin_38068071 2019-09-12 03:58:23

import threading, time class A(): def __init__(self,a): self.a = a def run(self): print(self.a) if __name__=='__main__': index = [0] thread_list = [] for i in range(10): index[0] = i thread_list.append(threading.Thread(target=A(index).run)) for thread in thread_list: thread.start() time.sleep(0.5) for thread in thread_list: thread.join() 这段代码没有显示[0] - [9]序列的正确结果,但所有结果都是[9]。但是,如果将其更改为thread_list.append(threading.Thread(target=A(tuple(index)).run)) 或直接启动而不是在另一个循环中启动它,或者将循环中的索引定义结果为OK。 这里的另外两个版本是否正确: import threading, time class A(): def __init__(self,a): self.a = a def run(self): print(self.a) if __name__=='__main__': index = [0] thread_list = [] for i in range(10): index[0] = i thread = threading.Thread(target=A(index).run) thread_list.append(thread_list) thread.start() time.sleep(0.5) for thread in thread_list: thread.join() import threading, time class A(): def __init__(self,a): self.a = a def run(self): print(self.a) if __name__=='__main__': thread_list = [] for i in range(10): index = [0] index[0] = i thread_list.append(threading.Thread(target=A(index).run)) for thread in thread_list: thread.start() time.sleep(0.5) for thread in thread_list: thread.join() 有人可以解释背后的Python如何初始化一个Thread对象的机制,调用start()方法。为什么当一个可变变量进入函数时,它总是最后一个?






...全文
29 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38073288 2019-09-12
  • 打赏
  • 举报
回复

你的第一部分代码做它做的原因是因为你在创建每个类A实例时传递了一个可变对象(名为index的列表),所以当它们打印它的值时,它们全都显示任何目前在其中 - 这将是最后一件事是在Thread实例本身在下面的行中创建之前被分配给index[0]。 因此,一种解决方法是避免将函数传递给可变对象。下面的内容显示了一个简单的方法: class A(): def __init__(self, a): self.a = a def run(self): print(self.a) if __name__=='__main__': index = [0] thread_list = [] for i in range(10): index[0] = i # thread_list.append(threading.Thread(target=A(index).run)) thread_list.append(threading.Thread(target=A(index[0]).run())) for thread in thread_list: thread.start() time.sleep(0.5) for thread in thread_list: thread.join()

476

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧