从导入的文件进行Python多处理

时间:2018-05-03 14:38:03

标签: python multiprocessing

请继续前往las编辑

我正面临一些问题,无法正确运行此代码。应该很容易,但是如果名称 ='主要'“我无法正确管理

我有2个文件,test1和test2,它的工作原理如下:

TEST1

import test2

test2.call(0,7)

TEST2

import multiprocessing as mp

in1 = 0
in2 = 0

def cube(x):
    return x ** 3

def call(data1, data2):
    global in1
    global in2
    in1 = data1
    in2 = data2


if __name__ == '__main__':
    pool = mp.Pool(processes=7)
    results = [pool.apply_async(cube, args=(x,)) for x in range(in1, in2)]
    output = [p.get() for p in results]
    print(output)

由于“__ main __”条件,我无法运行多进程,但是如果我将条件更改为“test1”,则没有任何反应,并且“test2”作为条件我收到带有错误的无限循环:

RuntimeError: 
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce an executable.

我该怎么办?

更多

您好,

我刚读过In the documentation: “在Windows以外的任何操作系统上调用时,调用freeze_support()无效。此外,如果Windows上的Python解释器正常运行该模块(程序尚未冻结),则freeze_support()无效。“

我的剧本是否正在发生?我总是使用Python解释器在Pycharm中获得无限循环。我怎么测试呢?

新尝试

如果我直接执行此脚本,它可以工作,我得到我的计算结果。

def cube(x):
    calc = x ** 3
    print(calc)
    return calc

if __name__ == '__main__':

print('hola')
x = 2
y = 4
p1 = mp.Process(target=cube, args=(x,))
p2 = mp.Process(target=cube, args=(y,))

p1.start()
p2.start()

p1.join()
p2.join()

但是当我从另一个文件执行它并且我将条件__ main __更改为“test2”(自己执行的名称)时,我得到上面显示的错误。尝试从另一个文件调用多进程是什么错误的?

3 个答案:

答案 0 :(得分:1)

您可以调试以查看对应的名称。 比如将其添加到test2.py

def print_name():
    print(__name__)

现在您应该看到,因为它在模块test2.py中,导入此模块时您的名称将为test2

另请注意,您要导入test2,但要从不存在的test拨打电话。因此,您可能会尝试从导入的lib中调用:

test2.call(0, 7)

答案 1 :(得分:0)

我意识到无法从另一个文件启动多任务运行。避免这种情况的方法是导入所需的功能并在同一文件中创建多任务运行。

TEST 1

from test2 import cube
import multiprocessing as mp

in1 = 0
in2 = 4
pool = mp.Pool(processes=7)
    results = [pool.apply_async(cube, args=(x,)) for x in range(in1, in2)]
    output = [p.get() for p in results]
    print(output)

TEST2

def cube(x):
    calc = x ** 3
    print(calc)
    return calc

这是一个解决方案,但我希望找到一个更优雅的解决方案。

由于

答案 2 :(得分:0)

这对我有用:

测试1

import test2
if __name__ == '__main__':
    test2.multiprocess_data(0,7)

测试2

import multiprocessing as mp

def cube(x):
    return x ** 3

def multiprocess_data(data1, data2):
    if __name__ == 'test2':
        pool = mp.Pool(processes=7)
        results = [pool.apply_async(cube, args=(x,)) for x in range(data1, data2)]
        output = [p.get() for p in results]
        print(output)