Python无阻塞异步调度

2024-04-25 01:41:07 发布

您现在位置: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()

Tags: 文件对象fromtestimportselfjson应用程序
1条回答
网友
1楼 · 发布于 2024-04-25 01:41:07

基本上for i in xrange(300)会阻塞你的主反应堆。下面是一个简单的方法,可以在load_objects函数中稍作休息,并将控制返回到reactor/event循环,以便完成其他任务。你知道吗

@defer.inlineCallbacks
def load_objects():
    for i in xrange(300):
        objects.append(JsonObject(i))

        if i % 100 == 0:
            yield    # take a break and let reactor do other tasks

        print("LOADED ALL OBJECTS")

还有^{}函数做了类似的事情,但我总是发现inlineCallbacks更直观。你知道吗

相关问题 更多 >