7

現在、Python で SimpleXMLRPCServer モジュールを使用してアプリケーションを作成しています。

このアプリケーションの基本的な目的は、サーバー上で実行し続け、タスクのキューをチェックし続けることです。Queue で新しいリクエストが見つかった場合は、そのリクエストを処理します。

私がやろうとしていることのスナップショット:

クラス MyClass():

"""
This class will have methods which will be exposed to the clients
"""
def __init__(self):
    taskQ = Queue.Queue()

def do_some_task(self):
    while True:
         logging.info("Checking the Queue for any Tasks..")
         task = taskQ.get()
         # Do some processing based on the availability of some task

主要

名前== "メイン" の場合:

server = SimpleXMLRPCServer.SimpleXMLRPCServer((socket.gethostname(), Port)
classObj = MyClass()
rpcserver.register_function(classObj.do_some_task)
rpcserver.serve_forever()

サーバーが開始されると、do_some_task メソッド内で永遠にループに残り、タスクのキューをチェックし続けます。これが私が達成したかったことです。しかし、今はサーバーを正常にシャットダウンしたいと考えています。この場合、サーバーをシャットダウンできません。

これまで、「True」のグローバル フラグ STOP_SERVER を使用し、do_some_task while ループでそのステータスをチェックして、ループから抜け出してサーバーを停止しようとしました。しかし、助けはありません。

SimpleXMLRPCServer の SHUTDOWN() メソッドを使用してみましたが、何らかの無限ループに陥っているようです。

サーバーを正常にシャットダウンする適切な方法を提案していただけますか。

前もって感謝します

4

2 に答える 2

1

このserve_forever関数は、socketserverモジュールの基底クラスから継承されますBaseServer。この機能を見ると__shutdown_request、 と呼ばれる属性があり、これを使用して while ループの処理を中断できます。アンダースコアが 2 つあるため、マングルされた名前で変数にアクセスする必要があります: _BaseServer__shutdown_request

これらをすべてまとめると、次のように非常に単純な終了関数を作成できます。

from xmlrpc.server import SimpleXMLRPCServer

class MyXMLRPCServer(SimpleXMLRPCServer):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.register_function(self.quit)
    
    def quit(self):
        self._BaseServer__shutdown_request = True
        return 0
于 2021-11-30T16:52:10.013 に答える