0

我有一个运行多个 Web 服务的 Tornado Web 服务器。我需要服务 A 中的一个操作来调用服务 B 上的操作。我正在使用 Suds 对服务 B 进行此调用。目前一切都会挂起,除非我将 Suds 调用放入单独的线程中,但现在我需要从该调用(在线程 1 中)获取数据返回到主线程,以便我可以将其发送回原始请求 Web 服务(服务 A)。一些代码:

if input.payment_info.issuer == 'Amex':
    def t1():
        url = 'http://localhost:8080/PaymentService?wsdl'
        client = Client(url)
        result = client.service.process_amex(payment_info.issuer, payment_info.number, payment_info.sort_code)

    t = Thread(target=t1)
    t.start()
    if result == "Success":
        return result #How can I access it to return it to the main service

抱歉,如果不清楚,我知道线程是一个复杂的问题,但我在这里看不到任何其他选项,因为没有它,代码就会挂起。

编辑:需要明确的是,我没有使用 suds 来调用服务 A。唯一的 suds 实例用于调用服务 B。

根据 Alex Martelli 的帖子(http://stackoverflow.com/a/2846697/559504),我也尝试过使用队列,但它再次挂起。

if input.payment_info.issuer == 'Amex':
        def t1(q):
            url = 'http://localhost:8080/PaymentService?wsdl'
            client = Client(url)
            result = client.service.process_amex(payment_info.issuer, payment_info.number, payment_info.sort_code)
            q.put(result)
        q = Queue.Queue()
        t = Thread(target=t1, args=(q))
        t.daemon = True
        t.start()
        result = q.get()
        if result == "Success":
            return "Success"
4

1 回答 1

0

这是我拥有的多线程tkinter应用程序的片段,它使用 aQueue将数据从一个线程传递到另一个线程。我认为可能足以让您将其用作模板。

def check_q(self, _):
    log = self.logwidget
    go = True
    while go:
        try:
            data = queue.get_nowait()
            if not data:
                data = '<end>'  # put visible marker in output
                go = False
            log.insert(END, data)
            log.see(END)
        except Queue.Empty:
            self.after(200, self.check_q, ())
            go = False
于 2012-10-18T19:09:12.300 回答