对不起,我不知道如何描述我想要做的单个句子。基本上我每个对象都有足够快的速度,一次创建1个就不会阻塞,但是如果我有一个或几百个,那么它会阻止主循环。我正试图找到一种方法来减少加载对象时发生的口吃量。从本质上讲,我的应用程序必须渲染每一帧,并且如果任何东西长于一帧,应用程序开始出现抖动。Python无阻塞的扭曲异步调度
主要问题是,当我创建对象时,他们必须从json文件中查找数据并导入它。现在每个json文件本身都很快(0.006s),比一帧的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())? –
试过,结果也一样。 – Charlie
对不起,现在在这里已经很晚了,现在我无法想到任何有用的东西......我通常会把一些我不想干涉主程序的东西放到子程序中。你有想过吗? –