- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要运行很多进程,但不是同时运行,例如同时运行 4 个进程。 multiprocessing.Pool
正是我所需要的。但问题是,如果进程持续时间超过超时(例如 3 秒),我需要终止该进程。 Pool
只支持等待所有进程的超时,而不是每个进程。这就是我需要的:
def f():
process_but_kill_if_it_takes_more_than_3_sec()
pool.map(f, inputs)
我找不到一种简单的方法来使用 Pool
和超时。有 a solution来自 Eli Bendersky。它是一个通过Thread.join(timeout)
限制任意函数执行时间的函数。它有效,(尽管它的停止方法效果不佳)。但是这个方法在进程的主线程等待时运行一个新的不必要的线程,因为我们需要一个超时 Controller 。应该可以从一个点控制所有超时,像这样:
import time
from multiprocessing import Process
def f(n):
time.sleep(n)
timeout = 3
tasks = [1, 2, 4, 1, 8, 2]
procs = []
pool_len = 4
while len(tasks) > 0 or len(procs) > 0:
if len(tasks) > 0 and len(procs) < pool_len:
n = tasks.pop(0)
p = Process(target=f, args=(n,))
p.start()
procs.append({'n': n, 'p': p, 't': time.time() + timeout})
for d in procs:
if not d['p'].is_alive():
procs.remove(d)
print '%s finished' % d['n']
elif d['t'] < time.time():
d['p'].terminate()
procs.remove(d)
print '%s killed' % d['n']
time.sleep(0.05)
输出应该是:
1 finished
1 finished
2 finished
4 killed
2 finished
8 killed
问题:有没有办法使用Pool来解决这个问题?
最佳答案
您可以使 f(n)
协作,以便它始终在超时内完成(就像在 GUI/网络事件处理程序中一样)。
如果你不能让它合作,那么唯一可靠的选择是杀死运行该函数的进程:
import multiprocessing as mp
def run_with_timeout(timeout, func, *args):
receive_end, send_end = mp.Pipe(duplex=False)
p = mp.Process(target=func, args=args, kwargs=dict(send_end=send_end))
p.daemon = True
p.start()
send_end.close() # child must be the only one with it opened
p.join(timeout)
if p.is_alive():
####debug('%s timeout', args)
p.terminate()
else:
return receive_end.recv() # get value from the child
缺点是每次函数调用都需要一个新的进程(maxtasksperchild=1
Pool 的类比)。
使用线程 池很容易同时运行 4 个进程:
#!/usr/bin/env python
import logging
import time
from functools import partial
from multiprocessing.pool import ThreadPool
debug = logging.getLogger(__name__).debug
def run_mp(n, send_end):
start = time.time()
debug('%d starting', n)
try:
time.sleep(n)
except Exception as e:
debug('%d error %s', n, e)
finally:
debug('%d done, elapsed: %.3f', n, time.time() - start)
send_end.send({n: n*n})
if __name__=="__main__":
tasks = [1, 2, 4, 1, 8, 2]
logging.basicConfig(format="%(relativeCreated)04d %(message)s", level=logging.DEBUG)
print(ThreadPool(processes=4).map(partial(run_with_timeout, 3, run_mp), tasks))
0027 1 starting
0028 2 starting
0030 4 starting
0031 1 starting
1029 1 done, elapsed: 1.002
1032 1 done, elapsed: 1.002
1033 8 starting
1036 2 starting
2031 2 done, elapsed: 2.003
3029 (4,) timeout
3038 2 done, elapsed: 2.003
4035 (8,) timeout
[{1: 1}, {2: 4}, None, {1: 1}, None, {2: 4}]
注意:可能有 forking + threading issues ;您可以使用 fork-server 进程来解决它们。
关于python进程池在每个进程上都有超时不是所有的池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31255118/
我正在 Windows 10、Intel Core i7-8550U 处理器上使用 Python 3.7.4 尝试 python 多处理。 我正在使用两个函数测试多处理,一个使用基本的 sleep()
我在 Azure synapse Analytics 中使用 pyspark 代码创建了 3 个不同的笔记本。笔记本正在使用 Spark 池运行。所有 3 台笔记本都只有一个 Spark 池。当这 3
我在 Azure synapse Analytics 中使用 pyspark 代码创建了 3 个不同的笔记本。笔记本正在使用 Spark 池运行。所有 3 台笔记本都只有一个 Spark 池。当这 3
如果我在 ASP.NET 页面上创建一个新线程,则 IsThreadPoolThread 属性为 true。第一个问题是,它是来自 ASP.NET 池还是 CLR 池?第二个问题是,如果它来自 ASP
注意:这主要是关于 pg 或 Node-PostgreSQL 模块的问题。它有来自 Gatsby 和 Postgraphile 的详细信息,但我不需要这三个方面的专业知识,只需要 pg。 我有一个数据
我是一名优秀的程序员,十分优秀!