首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python3.9:多处理进程启动()得到了一个错误: TypeError:无法对“弱引用”对象进行选择

Python3.9:多处理进程启动()得到了一个错误: TypeError:无法对“弱引用”对象进行选择
EN

Stack Overflow用户
提问于 2022-07-25 13:57:57
回答 1查看 170关注 0票数 1

我试图通过使用多进程来减少运行时间。我得到了一个奇怪的错误TypeError: cannot pickle 'weakref' object,我不太清楚为什么会发生这个错误,因为我也使用这种方法运行另一个程序,但它正常运行。有人能解释一下为什么会发生这个错误吗?我已经遵循了这个Solution,但是它对我没有用。

代码语言:javascript
运行
复制
import multiprocessing
from scipy import stats
import numpy as np
import pandas as pd
class T_TestFeature:
    def __init__(self, data, classes):
        self.data = data
        self.classes = classes 
        self.manager = multiprocessing.Manager()
        self.pval = self.manager.list()
        
    def preform(self):
        process = []
        for i in range(10):
            process.append(multiprocessing.Process(target=self.t_test, args=(i,)))

        for p in process:
            p.start()

        for p in process:
            p.join()

    def t_test(self, k):
        index_samples = np.array(self.data)[:,k]
        rs1 = [index_samples[i] for i in range(len(index_samples)) if self.classes[i] == "Virginia"]
        rs2 = [index_samples[i] for i in range(len(index_samples)) if self.classes[i] != "Virginia"]
        self.pval.append(stats.ttest_ind(rs1, rs2, equal_var=False).pvalue)

def main():
    df = pd.read_excel("/Users/xxx/Documents/Project/src/flattened.xlsx")
    flattened = df.values.T
    y = df.columns
    result = T_TestFeature(flattened, y)
    result.preform()
    print(result.pval)

if __name__ == "__main__":
    main()
代码语言:javascript
运行
复制
Traceback (most recent call last):
  File "/Users/xxx/Documents/Project/src/t_test.py", line 41, in <module>
    main()
  File "/Users/xxx/Documents/Project/src/t_test.py", line 37, in main
    result.preform()
  File "/Users/xxx/Documents/Project/src/t_test.py", line 21, in preform
    p.start()
  File "/Users/xxx/opt/anaconda3/lib/python3.9/multiprocessing/process.py", line 121, in start
    self._popen = self._Popen(self)
  File "/Users/xxx/opt/anaconda3/lib/python3.9/multiprocessing/context.py", line 284, in _Popen
    return Popen(process_obj)
  File "/Users/xxx/opt/anaconda3/lib/python3.9/multiprocessing/popen_spawn_posix.py", line 32, in __init__
    super().__init__(process_obj)
  File "/Users/xxx/opt/anaconda3/lib/python3.9/multiprocessing/popen_fork.py", line 19, in __init__
    self._launch(process_obj)
  File "/Users/x/opt/anaconda3/lib/python3.9/multiprocessing/popen_spawn_posix.py", line 47, in _xxlaunch
    reduction.dump(process_obj, fp)
  File "/Users/xxx/opt/anaconda3/lib/python3.9/multiprocessing/reduction.py", line 60, in dump
    ForkingPickler(file, protocol).dump(obj)
TypeError: cannot pickle 'weakref' object
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-25 16:13:26

这里有一个更简单的方法来重现您的问题:

代码语言:javascript
运行
复制
from multiprocessing import Manager, Process


class A:
    def __init__(self):
        self.manager = Manager()

    def start(self):
        print("started")

if __name__ == "__main__":
    a = A()
    proc = Process(target=a.start)
    proc.start()
    proc.join()

您不能对包含管理器对象的实例进行分类,因为它们包含对它们启动的管理器进程的引用(因此,通常不能对包含类Process对象的实例进行筛选)。

一个简单的解决办法是不存储经理。一旦不保留对托管列表的引用,它将自动被垃圾收集:

代码语言:javascript
运行
复制
def __init__(self, data, classes):
    self.data = data
    self.classes = classes
    manager = multiprocessing.Manager()
    self.pval = manager.list()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73110506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档