【发布时间】:2017-08-12 00:10:40
【问题描述】:
对不起标题,但不知道如何用一句话来描述我想要做的事情。基本上,我拥有的每个对象都足够快,不会在一次创建 1 个时阻塞,但如果我有十几个或数百个,那么它会阻塞主循环。我正在尝试找到一种方法来减少加载对象时发生的口吃量。本质上,我必须渲染每一帧的应用程序,如果超过一帧,应用程序就会开始出现抖动。
主要问题是当我创建对象时,他们必须从 json 文件中查找数据并导入。现在每个 json 文件本身都非常快(0.006 秒),比一帧的 1/60 快。但是,当计数器开始变为 x*0.006 时,就会出现问题。
有趣的是,如果我使用 deferToThread 之类的东西,它仍然会阻塞主循环。这是我想要做的。我希望这些对象立即可用,因为立即完成它们非常重要。然而,实际的 json 加载并不那么重要,我希望它以某种方式安排它,以便其他人开始“填写”,可以这么说,因为它们变得可用。它们的可用顺序也是不必要的。
from twisted.internet import reactor, defer
from profilehooks import profile
import json
objects = []
def print_test(text):
print text
class JsonObject(object):
def __init__(self, i):
self.i = i
self.json_data = None
self.load() # <load data slowly somehow?>
# Threads not working either?
#d = threads.deferToThread(self.load)
#d.addCallback(self.set_json_data)
def load(self):
with open("{0}.json".format(str(self.i).zfill(3))) as f:
self.json_data = json.load(f)
#return self.json_data
def set_json_data(self, data):
print "GOT DATA", self.i
def load_objects():
for i in xrange(300):
objects.append(JsonObject(i))
print "LOADED ALL OBJECTS"
reactor.callLater(0, load_objects)
reactor.callLater(0.5, print_test, "test for blocking")
reactor.run()
【问题讨论】:
-
试过 reactor.callLater(0.1, self.load())?
-
也试过了,结果一样。
-
对不起,现在来得太晚了,我现在想不出任何有用的东西......我通常把一些我不想干扰主程序的东西放到子进程中。你考虑过吗?
标签: python json multithreading asynchronous twisted