当前位置: 首页 > 面试题库 >

Python多处理帮助有条件退出

蒋星雨
2023-03-14
问题内容

我在Python内的多处理方面breaking之以鼻,但我没有运气将话题缠住。基本上,我有一个过程很耗时。我需要将其运行在1到100的范围内,但是一旦满足我要寻找的条件,我想中止所有进程。条件是返回值==
90。

这是一个非多进程代码块。谁能给我一个例子,说明如何将其转换为多进程函数,一旦满足“ 90”的条件,代码将退出所有进程?

def Addsomething(i):
    SumOfSomething = i + 1    
    return SumOfSomething

def RunMyProcess():
    for i in range(100):
        Something = Addsomething(i)
        print Something
    return

if __name__ == "__main__":
    RunMyProcess()

编辑:

测试第3版时出现此错误。知道是什么原因造成的吗?

Exception in thread Thread-3:
Traceback (most recent call last):
  File "C:\Python27\lib\threading.py", line 554, in __bootstrap_inner
    self.run()
  File "C:\Python27\lib\threading.py", line 507, in run
    self.__target(*self.__args, **self.__kwargs)
  File "C:\Python27\lib\multiprocessing\pool.py", line 379, in _handle_results
    cache[job]._set(i, obj)
  File "C:\Python27\lib\multiprocessing\pool.py", line 527, in _set
    self._callback(self._value)
  File "N:\PV\_Proposals\2013\ESS - Clear Sky\01-CODE\MultiTest3.py", line 20, in check_result
    pool.terminate()
  File "C:\Python27\lib\multiprocessing\pool.py", line 423, in terminate
    self._terminate()
  File "C:\Python27\lib\multiprocessing\util.py", line 200, in __call__
    res = self._callback(*self._args, **self._kwargs)
  File "C:\Python27\lib\multiprocessing\pool.py", line 476, in _terminate_pool
    result_handler.join(1e100)
  File "C:\Python27\lib\threading.py", line 657, in join
    raise RuntimeError("cannot join current thread")
RuntimeError: cannot join current thread

问题答案:

也许您正在寻找这样的东西?请记住,我正在为Python 3编写。上面的打印语句是Python 2,在这种情况下,应注意的是使用xrange而不是range。

from argparse import ArgumentParser
from random import random
from subprocess import Popen
from sys import exit
from time import sleep

def add_something(i):

    # Sleep to simulate the long calculation
    sleep(random() * 30)
    return i + 1

def run_my_process():

    # Start up all of the processes, pass i as command line argument
    # since you have your function in the same file, we'll have to handle that
    # inside 'main' below
    processes = []
    for i in range(100):
        processes.append(Popen(['python', 'thisfile.py', str(i)]))

    # Wait for your desired process result
    # Might want to add a short sleep to the loop
    done = False
    while not done:
       for proc in processes:
            returncode = proc.poll()
            if returncode == 90:
                done = True
                break

    # Kill any process that are still running
    for proc in processes:

        if proc.returncode is None:

            # Might run into a race condition here,
            # so might want to wrap with try block
            proc.kill()

if __name__ == '__main__':

    # Look for optional i argument here
    parser = ArgumentParser()
    parser.add_argument('i', type=int, nargs='?')
    i = parser.parse_args().i

    # If there isn't an i, then run the whole thing
    if i is None:
        run_my_process()

    else:
        # Otherwise, run your expensive calculation and return the result
        returncode = add_something(i)
        print(returncode)
        exit(returncode)

编辑:

这是一个使用多处理模块而不是子进程的更干净的版本:

from random import random
from multiprocessing import Process
from sys import exit
from time import sleep

def add_something(i):

    # Sleep to simulate the long calculation
    sleep(random() * 30)

    exitcode = i + 1
    print(exitcode)
    exit(exitcode)

def run_my_process():

    # Start up all of the processes
    processes = []
    for i in range(100):
        proc = Process(target=add_something, args=[i])
        processes.append(proc)
        proc.start()

    # Wait for the desired process result
    done = False
    while not done:
        for proc in processes:
            if proc.exitcode == 90:
                done = True
                break

    # Kill any processes that are still running
    for proc in processes:
        if proc.is_alive():
            proc.terminate()

if __name__ == '__main__':
    run_my_process()

编辑2:

这是最后一个版本,我认为它比其他两个版本要好得多:

from random import random
from multiprocessing import Pool
from time import sleep

def add_something(i):

    # Sleep to simulate the long calculation
    sleep(random() * 30)
    return i + 1

def run_my_process():

    # Create a process pool
    pool = Pool(100)

    # Callback function that checks results and kills the pool
    def check_result(result):
        print(result)
        if result == 90:
            pool.terminate()

    # Start up all of the processes
    for i in range(100):
        pool.apply_async(add_something, args=[i], callback=check_result)

    pool.close()
    pool.join()

if __name__ == '__main__':
    run_my_process()


 类似资料:
  • 关于颜色配置文件 精确、一致的色彩管理要求所有的颜色设备具有准确的符合 ICC 规范的配置文件。例如,如果没有准确的扫描仪配置文件,一个正确扫描的图像可能在另一个程序中显示不正确,这只是由于扫描仪和显示图像的程序之间存在差别。这种产生误导的表现可能使您对已经令人满意的图像进行不必要的、费时的、可能是破坏性的“校正”。利用准确的配置文件,导入图像的程序能够校正任何设备差别并显示扫描的实际颜色。 色彩

  • 问题内容: 我试图获取表中每个记录的“值”列的条件总和,其中所有“先前”记录均按相同的“类别”字段值和相同的“批准”字段值分组,然后分为负数和负数正数。 在我的程序中,用户可以按任何顺序创建文档记录,因此“上一个”定义为: 如果 Approved = TRUE,则“上一个”记录的 ApprovedDate 字段值比当前记录的字段早。如果 ApprovedDate 字段值相同,则“先前”记录的 Do

  • 问题内容: 在我使用任何一种编程语言的1个月的经验中,我假设 条件可以接受括号中的任何内容作为布尔检查事,例如: 明白我的意思了吗? 就像是 可悲的是,似乎没有这种方式。我不能在开关盒中进行布尔检查。 有办法解决吗? 顺便说一句,如果我听起来很困惑,那就非常抱歉。我还不太了解这种语言的名称:X 任何答复 问题答案: 您可以针对以下情况获得OR: 案例就像一个“ goto”,多个goto可以共享同一

  • 问题内容: 在Java / C#中,您可以轻松地逐步执行代码以查找可能出了问题的地方,而IDE使此过程非常人性化。 您能以类似的方式跟踪python代码吗? 问题答案: 是! 有一个Python调试器pdb就是为了这样做! 你可以pdb使用或通过启动Python程序。 你可以执行一些命令,这些命令已在pdb页面中记录。 需要记住的一些有用的是: b:设置一个断点 c:继续调试,直到遇到断点 s:单

  • 条件处理 if 这个special form跟java里面的if的语义是一样的, 它接受三个参数, 第一个是需要判断的条件,第二个表达式是条件成立的时候要执行的表达式,第三个参数是可选的,在条件不成立的时候执行。如果需要执行多个表达式,那么把多个表达式包在do里面。看例子: (import '(java.util Calendar GregorianCalendar)) (let [gc (Gre

  • 我有一些图像只包含数字和分号。 您可以在这里看到更多:https://imgur.com/a/54dsl6h 它们在我看来非常干净和简单,但Tesseract认为它们是空的“页面”()。 我怎么做才能让Tesseract更好地识别角色?