Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.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_Multiprocessing - Fatal编程技术网

Python-使用安全添加函数的多处理

Python-使用安全添加函数的多处理,python,multiprocessing,Python,Multiprocessing,我编写了代码,将每个数字加上3,并在多处理中返回它们。它似乎工作得很好,但我很好奇Cal.add函数是否以正确的方式使用。立即创建了cal类实例(由pid检查)。有没有办法在池创建的其他线程中使用相同的内存?没有,不要这样做。Python有GIL防止多个内核访问同一内存,从而避免内存泄漏。多处理旨在使用多个内核执行多个独立的任务,但仍遵循GIL。cal实例只创建一次,但通过fork,它会为每个工作人员复制。如果我在工作类中为每个工作实例创建cal实例,如“return cal().add(par

我编写了代码,将每个数字加上3,并在多处理中返回它们。它似乎工作得很好,但我很好奇Cal.add函数是否以正确的方式使用。立即创建了cal类实例(由pid检查)。有没有办法在池创建的其他线程中使用相同的内存?

没有,不要这样做。Python有GIL防止多个内核访问同一内存,从而避免内存泄漏。多处理旨在使用多个内核执行多个独立的任务,但仍遵循GIL。cal实例只创建一次,但通过fork,它会为每个工作人员复制。如果我在工作类中为每个工作实例创建cal实例,如“return cal().add(param)”,会怎么样。那还不安全吗?不,不要那样做。Python有GIL防止多个内核访问同一内存,从而避免内存泄漏。多处理旨在使用多个内核执行多个独立的任务,但仍遵循GIL。cal实例只创建一次,但通过fork,它会为每个工作人员复制。如果我在工作类中为每个工作实例创建cal实例,如“return cal().add(param)”,会怎么样。那还不安全吗?
import multiprocessing
import time
from multiprocessing import Pool
import os
class Cal:
    def add( self, num):
        added = num + 3
        time.sleep(3)
        print( str(os.getppid()) + " // " + str( num) + " -> " + str( added))
        return added
class Worker:
    def __init__( self, cal):
        self.cal = cal
    def run( self, param):
        return cal.add( param)

cal = Cal()
def fun( num):
    return Worker( cal).run( num)

cpuCount = multiprocessing.cpu_count()
with Pool( cpuCount) as p:
    print( p.map(fun, range(50)))