首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python的main函数中处理线程函数返回的数据

如何在Python的main函数中处理线程函数返回的数据
EN

Stack Overflow用户
提问于 2020-03-31 20:19:39
回答 2查看 45关注 0票数 3

我有一个python脚本,我已经在其中创建了一个线程。下面是代码片段

代码语言:javascript
复制
stop_thread = False
get_data = False
status = ""
subject_id = ""


def get_data_function():
    global stop_thread
    global get_data 
    global status
    global subject_id

    while stop_thread is False:
        if get_data:
            # SOME CODE
            # SOME MORE CODE
            (status, subject_id) = tive.extract_data()

            get_data = False

        time.sleep(1)


def main():
    global stop_thread
    global get_data 
    global status
    global subject_id

    thread = Thread(target=get_data_function)
    thread.start()
    res_dict = dict()
    while True:
        # SOME CODE
        # SOME MORE CODE

        if some_condition:
            get_data = True

            res_dict['status'] = status
            res_dict['subject_id'] = subject_id

        # SOME CODE
        # SOME MORE CODE

在上面的代码中,我定义了一个线程和它的函数get_data_function()。此函数调用提供status, subject_idtive.extract_data()。我将这些变量定义为全局变量,这样一旦我们有了这些变量的值,我就可以在main函数中使用它。

main函数中,在some_conditionTrue之后,我们需要获取statussubject_id的值,因此我将全局变量get_data设置为True,这将启用get_data_function主代码并返回数据,但问题是tive.extract_data()需要2-3秒来响应,因为main函数中的< code >D14和res_dict['subject_id'] = subject_id在2-3秒内出现错误,之后它开始正常工作。

有没有其他方法可以优化处理这些变量的值,这样在我们没有这些变量的值之前,我们不会得到错误。请帮帮忙。谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-31 20:35:03

我会定义一个线程类。我使用全局变量的经验很差。

代码语言:javascript
复制
# ==================================================================================
class ThreadGetData(Thread):

    def __init__(self):
        super().__init__()

        self.stop_thread = False
        self.get_data = False
        self.status = ""
        self.subject_id = ""
        self.data_present = False

    # ------------------------------------------------------------------------------
    def get_data_function(self):

        if self.get_data:
            # SOME CODE
            # SOME MORE CODE
            (self.status, self.subject_id) = tive.extract_data()
            self.data_present = True
            self.get_data = False

        time.sleep(1)

    # ------------------------------------------------------------------------------
    def run(self):
        while not self.stop_thread:
            self.get_data_function()



# ==================================================================================
def main():

    thread = ThreadGetData()
    thread.start()

    res_dict = dict()
    while True:
        # SOME CODE
        # SOME MORE CODE

        if some_condition:
            thread.get_data = True

       if thread.data_present:
            res_dict['status'] = thread.status
            res_dict['subject_id'] = thread.subject_id
            self.data_present = False

        # SOME CODE
        # SOME MORE CODE
票数 1
EN

Stack Overflow用户

发布于 2020-03-31 22:38:20

我会使用Python3的asyncio模块,并使用协程而不是线程。然后,您可以将在需要第一个协程返回的值之前可以完成的所有操作移动到第二个协程中。然后,使用asyncio.gather()并行运行这两个协程,直到它们都完成。

下面是一个演示此模式的简单示例:

代码语言:javascript
复制
import asyncio
import datetime

async def main():
    print("Starting at " + str(datetime.datetime.now()))
    values = await asyncio.gather(get_value(3), do_other_stuff())
    print("Received: " + str(list(values)[0]))
    print("Finished at " + str(datetime.datetime.now()))

async def get_value(n):
    await asyncio.sleep(3)
    return n*10

async def do_other_stuff():
    print("doing things 1")
    await asyncio.sleep(1)
    print("doing things 2")
    await asyncio.sleep(2)
    print("doing things 3")


if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60950397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档