簡體   English   中英

python / twisted上的客戶端/服務器

[英]Client/server on python-twisted

我正在嘗試制作一個Twisted應用程序,該應用程序一方面是XMLRPC服務器,另一方面是特殊非對稱二進制協議的客戶端(我們稱其為“ binary”),現在它的工作方式如下:

  1. 接收xmlrpc請求並返回請求ID(我是服務器)
  2. 向“二進制”服務器發出請求(我是客戶端)
  3. xmlrpc客戶端使用(1)中給出的請求ID進行輪詢請求。
  4. 輪詢請求返回“稍后重試”或實際結果(如果已由“二進制”協議給出)。

現在可以使用,但是我想放棄輪詢程序。

但是,當我處於xmlrpc請求處理過程中時,“二進制”協議交換不會執行,因此我從“二進制”服務器中從未得到結果。

你有什么建議? 線程分開? 還有嗎

from twisted.internet import reactor

reactor.connectTCP(globalconf.cfgBinServerAddr, globalconf.cfgBinServerPort, BinFactory(binProtocol))

reactor.listenTCP(globalconf.xmlrpcPort, server.Site(xmlrpcProtocol))
reactor.run()
  1. 接收xmlrpc請求。 如果需要它向“二進制”服務器發出請求,則計算請求ID。 不要從方法中返回
  2. 使用相同的方法向“二進制”服務器(您是客戶端)發出異步請求。 還沒回來
  3. 刪除此步驟(xmlrpc請求尚未完成,沒有可輪詢的內容)
  4. 返回延遲的“實際結果”。 大功告成 當准備好xmlrpc客戶端時,xmlrpc機械將返回真實結果

這是一個示例xmlrpc服務器,它返回延遲的子進程輸出:

#!/usr/bin/env python
from timeit import default_timer as timer
from twisted.internet import reactor, utils
from twisted.web import xmlrpc, server

class Example(xmlrpc.XMLRPC):
    def xmlrpc_echo(self, x):
        """Sanity check."""
        return x
    def xmlrpc_getoutput(self):
        shell_command = "echo before sleep; sleep 10; echo after sleep"
        start = timer()
        d = utils.getProcessOutput("/bin/sh", ["-c", shell_command])
        print("Deferred created in %.2f seconds" % (timer() - start,)) # instant
        return d

reactor.listenTCP(9657, server.Site(Example()))
reactor.run()

以及相應的xmlrpc客戶端:

#!/usr/bin/env python
from timeit import default_timer as timer
import xmlrpclib

s = xmlrpclib.Server('http://localhost:9657/')

def report_delay(func, *args):
    start = timer()
    print("Result %r took us %.2f seconds" % (func(*args), timer() - start))

report_delay(s.echo, "Mor-ee-air-teeeee") # should be instant
report_delay(s.getoutput) # should be ~10 seconds

暫無
暫無

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

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