扭曲的流程执行问题

时间:2012-03-07 22:57:40

标签: python twisted process

我遇到了Twisted的一些问题,并且运行了一系列一个接一个地执行脚本并返回退出代码的进程。

为了测试这个,我创建了五个测试脚本(test1.py,test2.py等),每个脚本中都包含以下内容:

#!/usr/bin/python

a = 1
b = 2
total = a + b

(文件的唯一区别是ab设置的数字(为脚本提供一些变化)。

然后我有以下脚本,应该逐个运行五个测试脚本,然后打印退出代码:

from twisted.internet import glib2reactor
glib2reactor.install()
from dbus.mainloop.glib import DBusGMainLoop
DBusGMainLoop(set_as_default=True)

import os.path

from twisted.internet import defer, reactor
from twisted.internet.protocol import ProcessProtocol

from ubuntuone.platform.tools import SyncDaemonTool

scriptslocation = "/home/jono/Desktop"

class SubprocessReturnCodeProtocol(ProcessProtocol):      
    def connectionMade(self):
        self.returnCodeDeferred = defer.Deferred()

    def processEnded(self, reason):
        self.returnCodeDeferred.callback(reason.value.exitCode)

    def outReceived(self, data):
        print data

    def errReceived(self, data):
        print data

class ScriptChecker():
    def __init__(self):
        print "init"
        self.run_scripts()

    @defer.inlineCallbacks
    def run_scripts(self):
        print "run scripts"

        accoms = [  { "script" : os.path.join(scriptslocation, "test1.py") },
                    { "script" : os.path.join(scriptslocation, "test2.py") },
                    { "script" : os.path.join(scriptslocation, "test3.py") },
                    { "script" : os.path.join(scriptslocation, "test4.py") },
                    { "script" : os.path.join(scriptslocation, "test5.py") }]

        for accom in accoms:
            print "Running: " + str(accom["script"])
            exitcode = yield self.run_a_subprocess([accom["script"]])
            print "Exit code: " + str(exitcode)

    def run_a_subprocess(self, command):
        pprotocol = SubprocessReturnCodeProtocol()
        reactor.spawnProcess(pprotocol, command[0], command, env=os.environ)        
        return pprotocol.returnCodeDeferred

if __name__ == '__main__':
    s = ScriptChecker()
    DBusGMainLoop(set_as_default=True)
    reactor.run()

不幸的是,我看到一些非常不稳定的行为。大多数情况下,脚本并非全部运行,并且它们会停留在其中一个脚本上并且不会继续运行,然后每隔一段时间就按预期运行所有脚本。

我对Twisted很新,不知道发生了什么事;任何想法?

1 个答案:

答案 0 :(得分:1)

安装反应堆后,您正在导入DBus物品;我怀疑这会在GTK本身内引起一些不良的交互,这可能会导致信号丢失或被错误的代码处理。

如果您将文件顶部更改为

from dbus.mainloop.glib import DBusGMainLoop
DBusGMainLoop(set_as_default=True)
from twisted.internet import glib2reactor
glib2reactor.install()

这可以解决什么问题吗?