1

この質問は、Django関連の質問に関連しています

wsgiref.simple_server で restlite WSGI アプリを実行しています。serve_forever() メソッドが呼び出される前に、いくつかのオブジェクトを初期化するように設定しました。最も関連性の高いこれらのクラス。

import Queue
import threading
import Deployer
import ParallelRunner
import sys
import subprocess

class DeployManager:
def __init__(self):
    self.inputQueue = Queue.Queue() 
    self.workerThread = DeployManagerWorkerThread(self.inputQueue)
    self.workerThread.start()   
def addDeployJob(self, appList):
    self.inputQueue.put(appList)  #make sure this handles the queue being full
def stopWorker(self):
    self.workerThread.running = False
def __del__(self):
    self.stopWorker()

class DeployManagerWorkerThread(threading.Thread):
def __init__(self, Queue):
    super(DeployManagerWorkerThread, self).__init__()
    self.queue = Queue
    self.running = True
    self.deployer = Deployer.Deployer()
    self.runner = ParallelRunner.ParallelRunner()

def run(self):
    while self.running:
        try:
            appList = self.queue.get(timeout = 10) #This blocks until something is in the queue
            sys.stdout.write('Got deployment job\n')
                            command = "ssh " + server.sshUsername + "@" + server.hostname + "" + " -i " + server.sshPrivateKeyPath + r" 'bash -s' < " + pathToScript 
                            self.process = subprocess.Popen(command,shell=True ,stdin=subprocess.PIPE, stdout=subprocess.PIPE)
            output = process.communicate()[0]
            sys.stdout.write(output + '\n')
        except Queue.Empty:
            pass
    sys.stdout.write('DeployManagerWorkerThread exiting\n')

Restliteリクエストは次のように設定されています

@restlite.resource
def deployAll():
def POST(request, entity):
    GlobalDeployManager.addDeployJob(GlobalAppList) #TODO should runners be configurable at start up
    #print output                                               #or on a run by run basis
    return 'Job added'
return locals()

これにより、workerThread が取得して処理を開始するキューにエントリが配置されます。しかし、POpen への呼び出しは常にハングします。私はこれに足を踏み入れましたが、サーバーを「フリーズ」させる os.fork() への呼び出しでハングしているように見えます。スレッドが POpen コマンドに到達すると、メイン スレッドは新しい要求を受け入れる行にいます。サーバーはこれに epoll を使用していると思います。キューに複数のジョブがある場合、サーバーが実行されているコンソールで Control-C を押すと、メイン スレッドが終了し (要求を待っている行ではありません)、スレッドが実行できるようになります。期待どおりに動作してから閉じます。何か案は?

4

1 に答える 1

0

私は最終的にこれを理解しました...runメソッドでthreadsオブジェクトを作成する必要がありました。initメソッドがメインスレッドから呼び出され、新しいスレッド自体がinitを実行しないことを誤って忘れてしまいました。

于 2012-10-24T19:04:02.180 に答える