我有一个python脚本,我已经在其中创建了一个线程。下面是代码片段
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_id的tive.extract_data()。我将这些变量定义为全局变量,这样一旦我们有了这些变量的值,我就可以在main函数中使用它。
在main函数中,在some_condition为True之后,我们需要获取status和subject_id的值,因此我将全局变量get_data设置为True,这将启用get_data_function主代码并返回数据,但问题是tive.extract_data()需要2-3秒来响应,因为main函数中的< code >D14和res_dict['subject_id'] = subject_id在2-3秒内出现错误,之后它开始正常工作。
有没有其他方法可以优化处理这些变量的值,这样在我们没有这些变量的值之前,我们不会得到错误。请帮帮忙。谢谢
发布于 2020-03-31 20:35:03
我会定义一个线程类。我使用全局变量的经验很差。
# ==================================================================================
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发布于 2020-03-31 22:38:20
我会使用Python3的asyncio模块,并使用协程而不是线程。然后,您可以将在需要第一个协程返回的值之前可以完成的所有操作移动到第二个协程中。然后,使用asyncio.gather()并行运行这两个协程,直到它们都完成。
下面是一个演示此模式的简单示例:
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())https://stackoverflow.com/questions/60950397
复制相似问题