- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 python suds基于本地 wsdl 文件制作 SOAP 客户端的库。我的目标是使用 Twisted 作为后端,因此我以异步方式查询 SOAP 服务器。
我知道这个话题已经被讨论过不同的时间(here1,here2),但我还有一些问题。
我见过三种不同的方法来使用 twisted 和 suds:
a) 应用这个 patch到 SOAP 水库。
b) 使用 twisted-suds ,这是泡沫的 fork 。
c) 受 this post 影响,我使用扭曲的 deferToThread
操作实现了 Client_Async
suds 客户端,(可以找到完整的工作要点 here 。我还实现了一个 Client_Sync
suds客户端也做一些基准测试)
# 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
我还没有测试方法 a) 或 b),我的问题是:
除了仅使用一个线程之外,我从中真正获得了什么?
最佳答案
我在我的项目中使用 SOAP 水。我不需要做任何补丁,也不需要使用扭曲的 SOAP 水。我正在使用 0.4.1-2 版本的 python-suds 包(在 ubuntu 上),它带有非常有用的 nosend 选项。
# This parses the wsdl file. The autoblend option you'd probably skip,
# its needed when name spaces are not strictly preserved (case for Echo Sign).
from suds import client
self._suds = client.Client('file://' + config.wsdl_path, nosend=True,
autoblend=True)
....
# Create a context for the call, example sendDocument() call. This doesn't yet
# send anything, only creates an object with the request and capable of parsing
# the response
context = self._suds.service.sendDocument(apiKey=....)
# Actually send the request. Use any web client you want. I actually use
# something more sophisticated, but below I put the example using
# standard twisted web client.
from twisted.web import client
d = client.getPage(url=context.client.location(),
postdata=str(context.envelope),
method='POST',
headers=context.client.headers())
# The callback() of the above Deferred is fired with the body of the
# http response. I parse it using the context object.
d.addCallback(context.succeeded)
# Now in the callback you have the actual python object defined in
# your WSDL file. You can print...
from pprint import pprint
d.addCallback(pprint)
# I the response is a failure, your Deferred would be errbacked with
# the suds.WebFault exception.
关于python - Benefits of twisted-suds - 使用 python suds SOAP 库的异步方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19569701/
我很恼火必须通过 Constructor 传递管道对象,因为我想为业务实体或要传递的值保留构造函数参数。 所以我想通过 setter ,但只要这些 setter 没有被填充,我的包含依赖项的对象就不应
假设我有以下代码: char[5][5] array; for(int i =0; i < 5; ++i) { for(int j = 0; j < 5; ++i) { ar
我一直在阅读关于 spl_autoload_register 函数作为 require、require_once、include 和 & 包含一次。尽管有很多关于如何实现这一点的讨论,但文档并不太详细
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
@TableGenerator 技术生成主键有什么好处?为什么我们使用这种技术以及如何使用用于存储生成器的序列名称和值的第三个表来获取数据? 最佳答案 来自链接。 http://en.wikibook
我正在使用 this 学习 Spring教程。我无法理解其中的以下摘录: Spring 使开发人员能够使用 POJO 开发企业级应用程序。仅使用 POJO 的好处是您不需要 EJB 容器产品(例如应用
Jhipster4 添加了数据传输对象(DTO),那么使用 DTO 对象有什么好处? 最佳答案 主要好处是更精确地控制从实体公开哪些属性,并公开实体聚合而不是单个实体。 关于java - 吉普斯特4
当用户提供数据并且我们使用该数据进行数据库插入或什至构建查询时,准备好的语句可以很好地防止 SQL 注入(inject)。但是,当我从数据库中检索先前插入的用户提供的数据时,PDO 真的有什么好处吗?
我用两种不同的方式编写了这个模板类:一种使用可变参数构造函数,另一种使用 std::initializer_list .出于这个问题的目的,我将以不同的方式命名类,但请注意,在我的项目中它是同一个类,
如果一个类型有一个不会失败的交换函数,这可以让其他函数更容易提供 strong exception safety guarantee .这是因为我们可以首先完成所有可能会失败的函数工作,然后使用非抛出
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
Unit8Array is a typed array represents an array of 8-bit unsignedintegers. This is what I
谁能解释一下 OAuth2 的优点以及我们为什么要实现它?我问是因为我对此有点困惑——这是我目前的想法: OAuth1(更准确地说是 HMAC)请求看起来合乎逻辑、易于理解、易于开发并且非常非常安全。
我继承了一些旧的 jquery 代码,并且我注意到原始开发人员到处都使用查询选择器“.class #id”。例如: $('.red #mydiv') 这更好、更差还是完全相同 $('#mydiv'
在 C++ 中使用这些运算符而不是隐式转换有什么好处? dynamic_cast (expression) reinterpret_cast (expression) static_cast (
我的异常处理技能非常初级,我总是很困惑我应该如何使用它们,而不是如何/语法。我目前正在使用 C#(如果有不同的东西适用的话)。 我的问题是,在开发应用程序时创建自己的异常类有什么好处?与抛出标准 Ex
套接字有这些new async methods since .NET 3.5与 SocketAsyncEventArgs 一起使用(例如 Socket.SendAsync() ),好处在于它们使用 I
我读了 Magnus Holm 的一篇题为 Block Helpers in Rails 3 的帖子。 ,其中他指出 Rails 3 过度弯曲 ERB 的语法。 (在“原始”ERB 中,ERB 构造只
我已通读 https://github.com/apotonick/roar ROAR 似乎花了很多心思。但是在使用 jbuilder 的相当标准的 Rails 支持的 JSON API 的上下文中,
我知道 Java 注解有三种保留策略: CLASS: Annotations are to be recorded in the class file by the compiler but need
我是一名优秀的程序员,十分优秀!