我在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更好地识别角色?