相关疑难解决方法(0)

键盘中断python的多处理池

如何使用python的多处理池处理KeyboardInterrupt事件?这是一个简单的例子:

from multiprocessing import Pool
from time import sleep
from sys import exit

def slowly_square(i):
    sleep(1)
    return i*i

def go():
    pool = Pool(8)
    try:
        results = pool.map(slowly_square, range(40))
    except KeyboardInterrupt:
        # **** THIS PART NEVER EXECUTES. ****
        pool.terminate()
        print "You cancelled the program!"
        sys.exit(1)
    print "\nFinally, here are the results: ", results

if __name__ == "__main__":
    go()
Run Code Online (Sandbox Code Playgroud)

当运行上面的代码时,KeyboardInterrupt当我按下时会引发上升^C,但是该过程只是挂起,我必须在外部杀死它.

我希望能够随时按下^C并使所有进程正常退出.

python pool multiprocessing keyboardinterrupt

127
推荐指数
8
解决办法
7万
查看次数

python多处理中的共享变量

第一个问题是Value和Manager()之间有什么区别.值?

第二,是否可以在不使用Value的情况下共享整数变量?以下是我的示例代码.我想要的是获取一个值为整数的字典,而不是值.我所做的只是在整个过程之后改变它.有没有更简单的方法?

from multiprocessing import Process, Manager

def f(n):
    n.value += 1

if __name__ == '__main__':
    d = {}
    p = []

    for i in range(5):
        d[i] = Manager().Value('i',0)
        p.append(Process(target=f, args=(d[i],)))
        p[i].start()

    for q in p:
        q.join()

    for i in d:
        d[i] = d[i].value

    print d
Run Code Online (Sandbox Code Playgroud)

python multiprocessing

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

捕获键盘中断以阻止 Python 多处理工作者处理队列

从在 stackoverflow 上找到的几篇文章中,我创建了这段代码。

设想

我想要一个 multiprocessing.queue 几个工人“听”

在键盘中断的情况下,主进程不应再将新项目放入队列中,并且在哨兵对象的帮助下,应该优雅地停止工作进程。

问题

我使用的当前版本的问题

signal.signal(signal.SIGINT, signal.SIG_IGN) 
Run Code Online (Sandbox Code Playgroud)

忽略 Ctrl + C 就是它也被主进程忽略了。

有任何想法吗 ?我需要使用多处理工作池吗?一些例子表明我可能不得不这样做。那我还可以使用队列吗?

from multiprocessing import Pool, Process,Queue
import time
import signal
# http://docs.python.org/3.1/library/multiprocessing.html#multiprocessing.Queue
# http://docs.python.org/3.1/library/multiprocessing.html#multiprocessing.Process


class Worker(Process):
    def __init__(self, queue,ident):
        super(Worker, self).__init__()
        # Ignore Signals
        signal.signal(signal.SIGINT, signal.SIG_IGN)
        self.queue= queue
        self.idstr= str(ident)
        print "Ident" + self.idstr

    def run(self):
        print 'Worker started'
        # do some initialization here

        print 'Computing things!'
        for data in iter( self.queue.get, None ):
            print "#" + self.idstr + " : " …
Run Code Online (Sandbox Code Playgroud)

python multithreading exception keyboardinterrupt

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

训练 Keras 模型时管道破裂

我正在使用 userdocker 在远程服务器上一个接一个地训练几个 Keras 模型。我通过 ssh 连接到服务器,让它们在不同的屏幕上运行。

为了加快速度,我在 5 个 GPU 上训练模型,以便同时训练 5 个不同的模型。

大多数情况下,模型训练没有任何问题:我分离屏幕,从服务器注销并让它们运行一夜。然而,有时他们会在培训过程中因管道破裂消息而停止。下面我包含了消息的最后一部分,因为我认为它可能是最相关的,但它很长且重复。

我发现这个问题有一个稍微相似的错误消息,他们链接到这个解释,但我看不出如何在我的情况下修复它,或者我在我的代码中犯了可能导致这个问题的错误并不总是发生。

有没有人在使用 Keras 或 userdocker 时遇到过类似的问题?怎样才能防止它发生?

错误信息


23/24 [==========================>..] - ETA:7s - 损失:1.7797 - acc:0.2219 Traceback(大多数最近调用最后一次):
文件“/usr/local/lib/python2.7/dist-packages/keras/utils/data_utils.py”,第 655 行,在 _data_generator_task self.queue.put((True, generator_output))
文件中",第 2 行,放入
文件 "/usr/lib/python2.7/multiprocessing/managers.py",第 759 行,在 _callmethod 类型中,结果 = conn.recv() EOFError

进程 Process-259:回溯(最近一次调用):
文件“/usr/lib/python2.7/multiprocessing/process.py”,第 258 行,在 _bootstrap self.run()
文件“/usr/lib/python2. 7/multiprocessing/process.py", line 114, in run self._target(*self._args, **self._kwargs)
File "/usr/local/lib/python2.7/dist-packages/keras/utils/ data_utils.py”,第 665 行,在 _data_generator_task self.queue.put((False, e))
文件“”,第 2 行,输入文件“/usr/lib/python2.7/multiprocessing/managers.py”,行758, in …

python gnu-screen broken-pipe docker keras

5
推荐指数
0
解决办法
946
查看次数