【发布时间】:2020-10-29 09:06:27
【问题描述】:
对于无法解决这个看似简单的问题,我有点沮丧:
我有一个函数需要一些时间来加载数据:
def import_data(id):
time.sleep(5)
return 'data' + str(id)
DataModel 类调用此函数并管理两个数据集。
class DataModel():
def __init__(self):
self._data_1 = import_data(1)
self._data_2 = import_data(2)
def retrieve_data_1(self):
return self._data_1
def retrieve_data_2(self):
return self._data_2
现在,主 UI 创建了 DataModel,同时调用了两个 import_data 函数,这会阻止它。
def main_ui():
# This takes 5 seconds for each dataset and blocks the main UI thread
dm = DataModel()
# Other stuff is happening. This time could be used to load data in the background
time.sleep(2)
# Retrieve the first dataset
data_1 = dm.retrieve_data_1()
# User interaction. This time could be used to load even larger datasets
time.sleep(10)
# Retrieve the second dataset
data_2 = dm.retrieve_data_2()
我希望在后台加载数据集以减少 UI 被阻塞的时间。 我的想法是像这样 pseudocode 实现它:
class DataModel():
def __init__(self):
self._data_1 = Thread(import_data(1)).start()
self._data_2 = Thread(import_data(2)).start()
def retrieve_data_1(self):
return self._data_1.wait_for_result()
def retrieve_data_2(self):
return self._data_2.wait_for_result()
import_data 函数在单独的线程中调用并返回 Future 对象。
retrieve_data 函数要么阻塞等待 Future 评估的主线程,要么立即返回其结果。
有没有简单的方法在 Python 3.x 中使用threading 和/或asyncio 实现这一点?提前致谢!
(编辑:语法更正)
【问题讨论】:
-
试试这个
Thread(target=import_data, args=(1,)).start()仍然需要等待数据。您将需要存储线程对象并调用.join()以查看它是否完成 -
感谢您的回答。使用这种方法,我很难检索线程返回的数据。一些帖子建议使用队列,但我更倾向于直接调用 .result()。
标签: python python-asyncio python-multithreading