получение результата от функции, запускающей deferToThread - PullRequest
1 голос
/ 23 июля 2010

Я недавно начал работать над витой, мало знакомой с его функциями. У меня есть проблема, связанная с методом "deferToThread" ... мой код здесь для использования этого метода

from twisted.internet.threads import deferToThread
from twisted.internet import reactor

results=[]
class Tool(object):

    def exectool(self,tool):

#     print "Test Class Exec tool running..........."
      exec tool
      return

    def getResult(self,tool):
        return results.append(deferToThread(self.exectool, tool))

to=Tool()

to.getResult(tools)


f=open(temp).read()
obj_tool=compile(f, 'a_filename', 'exec')

[at 0x8ce7020, файл "a_filename", строка 1>, в 0x8cd4e30, файл "a_filename", строка 2>]

Я передаю инструменты один за другим в методе getResults (), который выполняется успешно и печатает результаты, написанные сценариемв файле объекты.Я должен сохранить результат выполнения инструментов в некоторой переменной, чтобы я мог сохранить его в базе данных. Как добиться этого, когда я вызываю re = to.getResult (tools) и печатаю «re», он ничего не печатает.Я должен хранить свои результаты в базе данных?ЧТО-ТО, ЧТО Я МОГУ ДЕЛАТЬ?

Спасибо заранее

1 Ответ

3 голосов
/ 23 июля 2010

Здесь есть две проблемы.

Во-первых, deferToThread не будет работать, если вы никогда не запустите реактор.Надеюсь, этот фрагмент кода был на самом деле извлечен из более крупного приложения, использующего Twisted, в котором работает реактор, так что это не будет для вас реальной проблемой.Но вы не должны ожидать, что этот фрагмент будет работать, если вы не добавите к нему вызов reactor.run().

Во-вторых, deferToThread возвращает Deferred.Deferred запускается с результатом вызова, который вы передали. Это описано в документации API .Многие API в Twisted возвращают Deferred, поэтому вы можете прочитать документацию, охватывающую их .Как только вы поймете, как они работают и как их использовать, многое станет намного проще.

...