在Python中的线程之间传递数据

时间:2012-10-18 18:17:10

标签: python multithreading tornado suds

我有一个运行多个Web服务的Tornado Web服务器。我需要服务A中的一个操作来调用服务B上的操作。我正在使用Suds来调用Service 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"

1 个答案:

答案 0 :(得分:0)

这是我有一个多线程tkinter应用程序的片段,它使用Queue将数据从一个线程传递到另一个线程。我认为你可能已经足够用它作为模板了。

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