python - Python多处理:如何将共享变量用于复杂类的列表?
问题描述
在 Python 中使用多处理时,我希望将一个类的列表作为共享变量。该类可以看成如下(简化):
class testClass():
def __init__(self):
self.a = []
self.b = []
然后,我使用多处理来处理“testClass”列表:
from multiprocessing import Process, Manager
def testProc(a_list):
for i in range(10):
a_list[1].a.append([1])
print('a_list[1] address: in processing', a_list[1])
if __name__ == '__main__':
manager = Manager()
testList = [testClass() for i in range(4)]
a_list = manager.list(testList)
print('a_list[1] address: initial ', a_list[1])
process_0 = Process(target=testProc, args=(a_list,))
process_0.start()
process_0.join()
print('a_list[1] address: final ', a_list[1])
然后结果是:
a_list[1] address: initial <__main__.testClass object at 0x7f666c160f60>
a_list[1] address: in processing <__main__.testClass object at 0x7f666c16cf28>
a_list[1] address: in processing <__main__.testClass object at 0x7f666c16cf28>
a_list[1] address: final <__main__.testClass object at 0x7f666c160f98>
可以看出,链表元素的地址因地而异,不能作为共享变量。我怎么解决这个问题?
解决方案
将a
和b
类属性移到__init__
函数之外
class testClass():
a = []
b = []
这样,a
并且b
将是类变量,由所有testClass
实例共享。
推荐阅读
- crash - Visual Studio 2019:.NET Core 项目中的 System.Threading.Tasks.Dataflow 错误
- css - Chakra UI 全高组件
- path - 处理支持 URL 的跨平台文件路径的推荐方法?
- flutter - 我应该如何在颤动中从 json 更改应用程序语言
- vue.js - 多个 Vue Single SPA 与同一组件的不同版本
- javascript - 退出 if 语句并继续下一个代码
- swift - 如何使用新的 Swift 结构化并发启动后台任务?
- python - 在 docker 容器中构建 dlib 失败
- sql-server - 复制两个独立数据库中某些表的更改
- kubernetes - 虚拟服务端口配置适用于一个命名空间,但不适用于另一个