Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中的并行进程中运行类方法_Python_Python 3.x_Multiprocessing - Fatal编程技术网

在python中的并行进程中运行类方法

在python中的并行进程中运行类方法,python,python-3.x,multiprocessing,Python,Python 3.x,Multiprocessing,我试图并行运行一个巨大的循环,但失败了。循环恰好是特定类的一个方法,在循环中我调用它的另一个方法。它确实可以工作,但由于某些原因,列表中只有一个进程,并且输出(请参见代码)始终为“Worker 0”。要么进程没有创建,要么它们没有并行运行。结构如下: main.py from my_class.py import MyClass def main(): class_object = MyClass() class_object.method() if __name__ ==

我试图并行运行一个巨大的循环,但失败了。循环恰好是特定类的一个方法,在循环中我调用它的另一个方法。它确实可以工作,但由于某些原因,列表中只有一个进程,并且输出(请参见代码)始终为“Worker 0”。要么进程没有创建,要么它们没有并行运行。结构如下:

main.py

from my_class.py import MyClass

def main():
    class_object = MyClass()
    class_object.method()

if __name__ == '__main__':
    main()
我的班

from multiprocessing import Process

MyClass(object):
    def __init__(self):
        # do something

    def _method(self, worker_num, n_workers, amount, job, data):
        for i, val in enumerate(job):
            print('Worker %d' % worker_num)
            self.another_method(val, data)

    def another_method(self):
        # do something to the data

    def method(self):
        # definitions of data and job_size go here

        n_workers = 16
        chunk = job_size // n_workers
        resid = job_size - chunk * n_workers

        workers = []
        for worker_num in range(n_workers):
            st = worker_num * chunk
            amount = chunk if worker_num != n_workers - 1 else chunk + resid
            worker = Process(target=self._method, args=[worker_num, n_workers, amount, job[st:st+amount], data])
            worker.start()
            workers.append(worker)

        for worker in workers:
            worker.join()

        return data
我读过一些关于要求主模块可导入的子进程的内容,但我不知道在我的例子中如何做到这一点

问题:。。。但仍然只有一个核心在使用。所以问题是,我可以将多个核与进程对象一起使用吗

这并不取决于Python解释器,该解释器使用的是哪个CPU 相关:

使用以下内容扩展您的
def\u方法(…
),以查看实际发生的情况:

注意
getpidcore(pid)
依赖于分发,可能会失败

输出

core:1 pid:7623 Worker((0, 16, 1, [1]))
core:1 pid:7625 Worker((2, 16, 1, [3]))
core:0 pid:7624 Worker((1, 16, 1, [2]))
core:1 pid:7626 Worker((3, 16, 1, [4]))
core:1 pid:7628 Worker((5, 16, 1, [6]))
core:0 pid:7627 Worker((4, 16, 1, [5]))
在Linux上用Python:3.4.2测试

问题:…但仍然只有一个内核在使用。所以问题是,我可以将多个内核与流程对象一起使用吗

这并不取决于Python解释器,该解释器使用的是哪个CPU 相关:

使用以下内容扩展您的
def\u方法(…
),以查看实际发生的情况:

注意
getpidcore(pid)
依赖于分发
,可能会失败

输出

core:1 pid:7623 Worker((0, 16, 1, [1]))
core:1 pid:7625 Worker((2, 16, 1, [3]))
core:0 pid:7624 Worker((1, 16, 1, [2]))
core:1 pid:7626 Worker((3, 16, 1, [4]))
core:1 pid:7628 Worker((5, 16, 1, [6]))
core:0 pid:7627 Worker((4, 16, 1, [5]))

在Linux上使用Python:3.4.2进行测试

除了缺少
作业\u大小、作业、数据
之外,我正在运行您的示例并按预期工作。输出工作线程0到15。您似乎在重新发明轮子,您是否知道@stovfl是的,它确实按顺序工作(尽管它可能会打乱顺序),但我想在多核上并行使用它来加快计算速度。我对进程池不太了解,谢谢。我不认为您创建的worker是错误的。正如您所说,创建并运行了一个worker。因此您的类方法被正确地传输到worker。但是,我通常在启动之前创建所有workerrt它们。因此,我有一个小循环来创建工人,然后有一个循环来启动工人。@stovfl首先,感谢您的帮助,我尝试打印PID,但它们实际上是不同的,但仍然只有一个内核在使用。所以问题是,我可以将多个内核与流程对象一起使用,还是需要使用池?除了缺少
作业大小、作业、数据之外
我正在运行您的示例,并按预期工作。输出工作线程0到15。似乎您正在重新发明轮子,您是否知道@stovfl是的,它确实按顺序工作(尽管它可能会打乱顺序),但我想在多核上并行使用它来加快计算速度。我对进程池不太了解,谢谢。我不认为您创建的worker是错误的。正如您所说,创建并运行了一个worker。因此您的类方法被正确地传输到worker。但是,我通常在启动之前创建所有workerrt它们。所以我有一个小循环创建工人,然后一个循环启动工人。@stovfl首先,感谢您的帮助,我尝试打印PID,但它们实际上是不同的,但仍然只有一个内核在使用。所以问题是,我可以对进程对象使用多个内核,还是需要使用池?我无法复制这样的行为在我的案例中是r,为了mpi4py放弃了。无论如何,谢谢。在我的案例中,我无法重现这种行为,而是为了mpi4py放弃了。无论如何,谢谢。