相关疑难解决方法(0)

尝试python多处理的Windows上的RuntimeError

我正在尝试在Windows机器上使用线程和多处理的第一个正式的python程序.我无法启动进程,python提供以下消息.问题是,我没有在模块中启动我的线程.线程在类中的单独模块中处理.

编辑:顺便说一句,这个代码在ubuntu上正常运行.不是在窗户上

RuntimeError: 
            Attempt to start a new process before the current process
            has finished its bootstrapping phase.
            This probably means that you are on Windows 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 a Windows executable.
Run Code Online (Sandbox Code Playgroud)

我的原始代码很长,但我能够在删节版本的代码中重现错误.它分为两个文件,第一个是主模块,除了导入处理进程/线程和调用方法的模块之外,它只做很少的事情.第二个模块是代码的核心所在.


testMain.py:

import parallelTestModule

extractor = parallelTestModule.ParallelExtractor()
extractor.runInParallel(numProcesses=2, numThreads=4)
Run Code Online (Sandbox Code Playgroud)

parallelTestModule.py:

import multiprocessing …
Run Code Online (Sandbox Code Playgroud)

python windows multiprocessing

79
推荐指数
5
解决办法
5万
查看次数

Windows上的python多处理,如果__name__ =="__ main__"

在Windows 7(64位)上运行python 2.7.

在阅读库模块的文档时multiprocessing,它会多次声明模块的重要性__main__,包括条件(特别是在Windows中):

if __name__ == "__main__":
    # create Process() here
Run Code Online (Sandbox Code Playgroud)

我的理解是,你不想在模块的全局命名空间中创建Process()实例(因为当子进程导入模块时,他会无意中产生另一个).

我不必将流程管理器放在我的包执行层次结构的最顶层(在PARENT中执行).只要我的Process()在类方法中创建,管理和终止,甚至在函数闭包中.只是不在顶级模块命名空间中.

我是否正确理解了此警告/要求?


编辑

在前两个回复之后,我添加了这个引用.这是2.7文档中第16.6节多处理的介绍.

注意:此程序包中的功能要求__main__子程序可以导入该模块.这在编程指南中有所涉及,但值得在此指出.这意味着一些示例,例如multiprocessing.Pool示例在交互式解释器中不起作用......

python multiprocessing

14
推荐指数
1
解决办法
1万
查看次数

Ray 比 Python 和 .multiprocessing 慢得多

我上传了 130k json 文件。

我用以下方法做到这一点Python

import os
import json
import pandas as pd

path = "/my_path/"

filename_ending = '.json'


json_list = []

json_files = [file for file in os.listdir(f"{path}") if file.endswith(filename_ending)]

import time
start = time.time()

for jf in json_files:
    with open(f"{path}/{jf}", 'r') as f:

        json_data = json.load(f)

        json_list.append(json_data)

end = time.time()
Run Code Online (Sandbox Code Playgroud)

需要 60 秒。

我用以下方法做到这一点multiprocessing

import os
import json
import pandas as pd
from multiprocessing import Pool
import time

path = "/my_path/"

filename_ending = '.json' …
Run Code Online (Sandbox Code Playgroud)

python ray

5
推荐指数
1
解决办法
6160
查看次数

如何在 scipy.optimize.differential_evolution 中启用并行?

我正在尝试使用 scipy.optimize 中的different_evolution 找到函数的全局最小值。如 scipy 参考指南中所述,我应该在选项中设置:update='deferred',workers=number of cores

但是,当我运行代码时,它会冻结并且什么也不做。我该如何解决这个问题,或者有没有更好的方法来并行化全局优化器?

以下是我的代码:

scipy.optimize.differential_evolution(objective, bnds, args=(), 
            strategy='best1bin', maxiter=1e6,
            popsize=15, tol=0.01, mutation=(0.5, 1),    
            recombination=0.7, seed=None,
            callback=None, disp=False, polish=True,
            init='latinhypercube', atol=0,
            updating='deferred',workers=2)
Run Code Online (Sandbox Code Playgroud)

python-3.x differential-evolution

4
推荐指数
1
解决办法
2662
查看次数

Windows 上的 python 多处理

我对 python 编程还很陌生,需要一些帮助来理解 python 解释器流程,尤其是在多处理的情况下。请注意,我在 Windows 10 上运行 python 3.7.1。这是我的简单实验代码和输出。

import multiprocessing
import time


def calc_square(numbers, q):
    for n in numbers:
        q.put(n*n)
        time.sleep(0.2)

    q.put(-1)
    print('Exiting function')


print('Now in the main code. Process name is: ' + __name__)

if __name__ == '__main__':
    numbers = [2, 3, 4, 5]
    q = multiprocessing.Queue()
    p = multiprocessing.Process(target=calc_square, args=(numbers, q))

    p.start()

    while True:
        if q.empty() is False:
            nq = q.get()
            print('Message is:' + str(nq))
            if nq == -1:
                break
    print('Done')

    p.join()

Program Output:

Now in …
Run Code Online (Sandbox Code Playgroud)

python windows multiprocessing

3
推荐指数
1
解决办法
1万
查看次数

Windows多处理

正如我所发现的,在进行多处理时,windows有点麻烦,对此我有一个疑问。

pydoc指出,使用多重处理时,您应该保护Windows应用程序的入口点

这是否仅意味着创建新流程的代码?

例如

脚本1

import multiprocessing

def somemethod():
    while True:
        print 'do stuff'

# this will need protecting
p = multiprocessing.Process(target=somemethod).start()

# this wont
if __name__ == '__main__':
    p = multiprocessing.Process(target=somemethod).start()
Run Code Online (Sandbox Code Playgroud)

在此脚本中,您需要将其包装在if main中,因为产生该过程的行。 但是,如果有的话呢?

剧本2

file1.py

import file2
if __name__ == '__main__':
    p = Aclass().start()
Run Code Online (Sandbox Code Playgroud)

file2.py

import multiprocessing
ITEM = 0
def method1():
    print 'method1'

method1()

class Aclass(multiprocessing.Process):
    def __init__(self):
        print 'Aclass'
        super(Aclass, self).__init__()

    def run(self):
        print 'stuff'
Run Code Online (Sandbox Code Playgroud)

在这种情况下需要保护什么? 如果在文件2中有一个if __main__会发生什么,如果正在创建一个进程,该代码中的代码会被执行吗?

注意:我知道代码将无法编译。这只是一个例子。

python windows multiprocessing

2
推荐指数
1
解决办法
905
查看次数