簡體   English   中英

扭曲的流程執行問題

[英]Twisted process execution issues

我在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相當陌生,不知道發生了什么。 有任何想法嗎?

安裝反應堆后,您將導入DBus東西。 我懷疑這會導致GTK自身內部發生某些不良交互,從而可能導致信號丟失或由錯誤代碼處理。

如果將文件頂部更改為

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

可以解決什么問題嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM