4
我使用python suds庫作爲基於本地wsdl文件的SOAP客戶端。我的目標是使用Twisted作爲後端,所以我以異步的方式查詢SOAP服務器。扭曲泡沫的好處 - 異步使用蟒蛇肥皂的方式lib
我知道這個話題已經涵蓋了不同的時間(here1, here2),但我仍然有一些問題。
我已經看到了三種不同的方法來使用雙絞線用肥皂水:
一)運用這一patch到泡沫庫。
b)使用twisted-suds,這是泡沫分叉。
c)按this post影響,我使用扭曲deferToThread
操作來實現Client_Async
泡沫客戶端,(完全工作主旨可以發現here。我還實施了Client_Sync
泡沫客戶端,以及做一些基準)
# Init approach c) code
from suds.client import Client as SudsClient
from twisted.internet.threads import deferToThread
class MyClient(SudsClient):
def handleFailure(self, f, key, stats):
stats.stop_stamp(error=True)
logging.error("%s. Failure: %s" % (key, str(f)))
def handleResult(self, result, key, stats):
stats.stop_stamp(error=False)
success, text, res = False, None, None
try:
success = result.MessageResult.MessageResultCode == 200
text = result.MessageResult.MessageResultText
res = result.FooBar
except Exception, err:
pass
logging.debug('%40s : %5s %10s \"%40s\"' % (key, success, text, res))
logging.debug('%40s : %s' % (key, self.last_sent()))
logging.debug('%40s : %s' % (key, self.last_received()))
def call(stats, method, service, key, *a, **kw):
stats.start_stamp()
logging.debug('%40s : calling!' % (key))
result = service.__getattr__(method)(*a, **kw)
return result
class Client_Async(MyClient):
""" Twisted based async client"""
def callRemote(self, stats, method, key, *args, **kwargs):
logging.debug('%s. deferring to thread...' % key)
d = deferToThread(call, stats, method, self.service, key, *args, **kwargs)
d.addCallback(self.handleResult, key, stats)
d.addErrback(self.handleFailure, key, stats)
return d
class Client_Sync(MyClient):
def callRemote(self, stats, method, key, *args, **kwargs):
result = None
try:
result = call(stats, method, self.service, key, *args, **kwargs)
except Exception, err:
self.handleFailure(err, key, stats)
else:
self.handleResult(result, key, stats)
# End approach c) code
用c)的方式分異步模式的好處做一個小的基準:
-- Sync model using Client_Sync of approach c).
# python soap_suds_client.py -t 200 --sync
Total requests:800/800. Success:794 Errors:6
Seconds elapsed:482.0
Threads used:1
-- Async model using Client_Async of approach c).
# python soap_suds_client.py -t 200
Total requests:800/800. Success:790 Errors:10
Seconds elapsed:53.0
Threads used:11
我沒有測試接近)或b),我的問題是:
什麼我真的從他們身上獲得除了只使用一個線程?
是否需要v0.4.1-2? 'nosend'選項似乎回到0.4 https://fedorahosted.org/suds/wiki/Documentation#OPTIONS –
我不得不承認,我還沒有測試任何其他版本。我只是想給出一個特定的答案,指出我知道它確實有效的版本。 –
是的,有道理 - 謝謝澄清 –