0

複数の Web サービスを実行する Tornado Web サーバーがあります。サービス B のオペレーションを呼び出すには、サービス A のオペレーションの 1 つが必要です。サービス 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

これが不明確な場合は申し訳ありません。スレッド化が複雑な問題であることは知っていますが、スレッド化がないとコードがハングするため、ここには他のオプションがありません。

編集:明確にするために、サービスAを呼び出すためにsudsを使用していません.sudsの唯一のインスタンスは、サービスBを呼び出すために使用されています.

また、こちらの Alex Martelli の投稿 (http://stackoverflow.com/a/2846697/559504) に従って Queue を使用してみましたが、再びハングします。

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アプリケーションのフラグメントです。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
于 2012-10-18T19:09:12.300 に答える