将数据发送到Python线程,然后使用队列读取响应

2024-09-30 02:19:56 发布

您现在位置:Python中文网/ 问答频道 /正文

在一次执行每件事情时,使用队列模块通过线程发送或接收数据非常容易,但我不知道如何将数据发送到线程,然后正确地期望返回

在下面的示例中,我希望向线程发送一些东西以便进行处理,然后获取结果,但是main函数中的t.queue.get()接收刚才发送的内容,而不是等待线程返回。我怎样才能避开它

#!/usr/bin/env python3

from threading import Thread
from queue import Queue

class MyThread(Thread):
    queue:Queue

    def __init__(self, *args, **kwargs):
        super().__init__()
        self.queue = Queue()
        self.daemon = True

    # receives a name, then prints "Hello, name!"
    def run(self):
        while True:
            val = self.queue.get()
            if not val:
                break

            self.queue.put(f'Hello, {val}!')

def main():
    t = MyThread()
    t.start()

    # sends string to thread
    t.queue.put('Jurandir')

    # expects to receive "Hello, Jurandir!",
    # but "Jurandir" is immediately returned
    ret = t.queue.get()

    print(ret)

if __name__ == '__main__':
    main()

Tags: namefromimportselfhellogetqueuemain
1条回答
网友
1楼 · 发布于 2024-09-30 02:19:56

问题是,您正在从队列中立即获得所谓的结果,而工作人员仍然没有添加结果。您可以分为“输入队列”和“结果队列”。然后在主线程中等待,直到队列中有一些输出

#!/usr/bin/env python3

from threading import Thread, Lock
from queue import Queue


class MyThread(Thread):
    def __init__(self, *args, **kwargs):
        super().__init__()
        self.input_queue = Queue()
        self.results_queue = Queue()

        self.daemon = True

    # receives a name, then prints "Hello, name!"
    def run(self):
        while True:
            val = self.input_queue.get()

            if not val:
                break

            self.results_queue.put(f'Hello, {val}!')


def main():
    t = MyThread()
    t.start()

    # sends string to thread
    t.input_queue.put('Jurandir')

    ret = t.results_queue.get()
    while ret is None:
        ret = t.results_queue.get()
    print(ret)


if __name__ == '__main__':
    main()

相关问题 更多 >

    热门问题