Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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_Multithreading_Python 3.x_Subprocess_Multiprocessing - Fatal编程技术网

Python 尝试递归比较列表时,多处理模块出现运行时错误

Python 尝试递归比较列表时,多处理模块出现运行时错误,python,multithreading,python-3.x,subprocess,multiprocessing,Python,Multithreading,Python 3.x,Subprocess,Multiprocessing,我正在生成一个列表,其中包含随机生成的0和1的子列表,然后尝试将每个列表与其他列表进行比较,以高效地确定它们的相似性 我知道我的代码只处理一个进程(即不涉及多处理,但一旦我开始涉及多处理.Pool()或多处理.process()一切都开始崩溃 我想比较一个进程与多个进程相比需要多长时间。我尝试了线程化,但一个进程实际花费的时间更少,可能是因为全局解释器锁 这是我的密码: import difflib import secrets import timeit import multiprocess

我正在生成一个列表,其中包含随机生成的0和1的子列表,然后尝试将每个列表与其他列表进行比较,以高效地确定它们的相似性

我知道我的代码只处理一个进程(即不涉及
多处理
,但一旦我开始涉及
多处理.Pool()
多处理.process()
一切都开始崩溃

我想比较一个进程与多个进程相比需要多长时间。我尝试了
线程化
,但一个进程实际花费的时间更少,可能是因为全局解释器锁

这是我的密码:

import difflib
import secrets
import timeit
import multiprocessing
import numpy

random_lists = [[secrets.randbelow(2) for _ in range(500)] for _ in range(500)]
random_lists_split = numpy.array_split(numpy.array(random_lists), 5)


def get_similarity_value(lists_to_check, sublists_to_check) -> list:
    ratios = []
    matcher = difflib.SequenceMatcher()
    for sublist_major in sublists_to_check:
        try:
            sublist_major = sublist_major.tolist()
        except AttributeError:
            pass
        for sublist_minor in lists_to_check:
            if sublist_major == sublist_minor or [lists_to_check.index(sublist_major), lists_to_check.index(sublist_minor)] in [ratios[i][1] for i in range(len(ratios))] or [lists_to_check.index(sublist_minor), lists_to_check.index(sublist_major)] in [ratios[i][1] for i in range(len(ratios))]:  # or lists_to_check.index(sublist_major.tolist()) > lists_to_check.index(sublist_minor):
                pass
            else:
                matcher.set_seqs(sublist_major, sublist_minor)
                ratios.append([matcher.ratio(), sorted([lists_to_check.index(sublist_major), lists_to_check.index(sublist_minor)])])
    return ratios


def start():
    test = multiprocessing.Pool(4)
    data = [(random_lists, random_lists_split[i]) for i in range(len(random_lists_split))]
    print(test.map(get_similarity_value, data))


statement = timeit.Timer(start)
print(statement.timeit(1))

statement2 = timeit.Timer(lambda: get_similarity_value(random_lists, random_lists))
print(statement2.timeit(1))
下面是错误:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\multiprocessing\spawn.py", line 105, in spawn_main
    exitcode = _main(fd)
  File "C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\multiprocessing\spawn.py", line 114, in _main
    prepare(preparation_data)
  File "C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\multiprocessing\spawn.py", line 225, in prepare
    _fixup_main_from_path(data['init_main_from_path'])
  File "C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\multiprocessing\spawn.py", line 277, in _fixup_main_from_path
    run_name="__mp_main__")
  File "C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\runpy.py", line 263, in run_path
    pkg_name=pkg_name, script_name=fname)
  File "C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\runpy.py", line 96, in _run_module_code
    mod_name, mod_spec, pkg_name, script_name)
  File "C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "timings.py", line 38, in <module>
    print(statement.timeit(1))
  File "C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\timeit.py", line 178, in timeit
    timing = self.inner(it, self.timer)
  File "<timeit-src>", line 6, in inner
  File "timings.py", line 32, in start
    test = multiprocessing.Pool(4)
  File "C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\multiprocessing\context.py", line 119, in Pool
    context=self.get_context())
  File "C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\multiprocessing\pool.py", line 174, in __init__
    self._repopulate_pool()
  File "C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\multiprocessing\pool.py", line 239, in _repopulate_pool
    w.start()
  File "C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\multiprocessing\process.py", line 105, in start
    self._popen = self._Popen(self)
  File "C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\multiprocessing\context.py", line 322, in _Popen
    return Popen(process_obj)
  File "C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\multiprocessing\popen_spawn_win32.py", line 33, in __init__
    prep_data = spawn.get_preparation_data(process_obj._name)
  File "C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\multiprocessing\spawn.py", line 143, in get_preparation_data
    _check_not_importing_main()
  File "C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\multiprocessing\spawn.py", line 136, in _check_not_importing_main
is not going to be frozen to produce an executable.''')
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.
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\multiprocessing\spawn.py”,第105行,在spawn\u main中
出口代码=_主(fd)
文件“C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\multiprocessing\spawn.py”,第114行,在主目录中
准备(准备数据)
文件“C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\multiprocessing\spawn.py”,第225行,在prepare中
_从路径修复主路径(数据['init\u main\u from\u path'])
文件“C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\multiprocessing\spawn.py”,第277行,位于\u fixup\u main\u from\u path
运行\u name=“\uuuuump\umain”)
文件“C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\runpy.py”,第263行,运行路径
pkg_name=pkg_name,script_name=fname)
文件“C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\runpy.py”,第96行,在运行模块代码中
模块名称、模块规格、组件名称、脚本名称)
文件“C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\runpy.py”,第85行,在运行代码中
exec(代码、运行\全局)
文件“timings.py”,第38行,在
打印(报表.时间(1))
文件“C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\timeit.py”,第178行,在timeit中
定时=自内(it、自定时器)
文件“”,第6行,在内部
文件“timings.py”,第32行,在开始处
测试=多处理。池(4)
文件“C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\multiprocessing\context.py”,第119行,在池中
context=self.get\u context())
文件“C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\multiprocessing\pool.py”,第174行,在\uuu init中__
自我重新填充池()
文件“C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\multiprocessing\pool.py”,第239行,在“重新填充”池中
w、 开始()
文件“C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\multiprocessing\process.py”,第105行,开始
self.\u popen=self.\u popen(self)
文件“C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\multiprocessing\context.py”,第322行,格式为
返回Popen(过程对象)
文件“C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\multiprocessing\popen\u spawn\u win32.py”,第33行,在\uuu init中__
prep_data=spawn.get_preparation_data(进程对象名称)
文件“C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\multiprocessing\spawn.py”,第143行,在get\u preparation\u data中
_选中\u not \u导入\u main()
文件“C:\ProgramData\Anaconda3\envs\Computing Coursework\lib\multiprocessing\spawn.py”,第136行,在\u check\u not\u importing\u main中
不会冻结以生成可执行文件。“”
运行时错误:
已尝试在启动之前启动新进程
当前进程已完成其引导阶段。
这可能意味着您没有使用fork启动您的应用程序
子进程,而您忘记了使用正确的习惯用法
在主模块中:
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
冻结支持()
...
如果程序
不会冻结以生成可执行文件。
注意:我曾尝试使用
多处理.freeze_support()
,但结果是相同的错误。代码似乎还试图无限期地运行,因为错误一次又一次地出现


谢谢

问题在于,您的顶级代码(包括创建子进程的代码)未受到保护,无法在子进程中运行

如前所述:,如果您没有使用
fork
start方法(并且由于您使用的是Windows,所以您没有):

确保新的Python解释器可以安全地导入主模块,而不会产生意外的副作用(例如启动新进程)

事实上,这与该警告后面的示例几乎相同。你要培养一整群孩子而不是一个,但这是同样的问题。池中的每个子进程都会尝试启动一个新池,幸运的是,
多处理
发现出现了一些不好的情况,并以
运行时错误
失败,而不是以指数形式生成进程,直到Windows拒绝再生成进程或其调度程序崩溃

正如文件所说:

相反,我们应该使用
来保护程序的“入口点”,如果uuu name\uuuuu=='\uuuu main\uuuu'

在您的情况下,这意味着这一部分:

if __name__ == '__main__':
    statement = timeit.Timer(start)
    print(statement.timeit(1))

    statement2 = timeit.Timer(lambda: get_similarity_value(random_lists, random_lists))
    print(statement2.timeit(1))

我得到一个不同的错误:
TypeError:get\u similarity\u value()缺少一个必需的位置参数:“sublists\u to\u check”
start@Maarten_vd_Sande奇怪的第二个参数(sublists_to_check)应该作为数据变量中元组列表的一部分进行传递。如果去掉
timeit
code,问题会消失吗?因为这似乎是由于
timeit
multiprocessing
试图以不太透明的方式透明地包装相同的顶级代码而导致的。