【问题标题】:Twisted Python: how to make a deferred object that waits for data from child process?Twisted Python:如何创建一个等待来自子进程的数据的延迟对象?
【发布时间】:2012-06-11 22:05:31
【问题描述】:

在 Echo 协议中的 lineReceived 方法中,我想在每次写入 child 时生成一个延迟对象。它将等待结果,然后在子进程处理完数据后打印结果。我需要找到一种方法来做到这一点。现在,MyPP 的函数 outReceived 从子进程中获取结果。

谢谢

from sys import executable
from os import environ
import os
from twisted.internet import reactor, defer
from twisted.internet.protocol import Protocol
from twisted.internet.protocol import Factory
from twisted.internet import protocol
from twisted.protocols.basic import LineReceiver
import sys
import time
import math

implementation = """
from filter import censor
censor()
"""                         

class Echo(LineReceiver): 

    def lineReceived(self, data): 
        if self.factory.pp == None:
            pp = MyPP()
            self.factory.pp = reactor.spawnProcess(pp, executable, [executable, "-c", implementation], 
                                                                   env=environ, childFDs = {0:"w", 1:"r", 2:"r"})   
        self.factory.pp.writeToChild(0, data+'\r\n')




class EchoFactory(Factory): 

    protocol = Echo 
    pp = None


class MyPP(protocol.ProcessProtocol): 

    def connectionMade(self):  
        print "connectionMade!" 

    def outReceived(self, data): 
        pass




reactor.listenTCP(11111, EchoFactory()) 
print 'in parent', os.getpid() 
reactor.run()

【问题讨论】:

  • 是的,但是您的问题是什么?这目前读起来就像“请为我实现 X”。你尝试了什么,它是如何失败的,你在哪里卡住了?
  • 我的尝试是在 writeToChild 行之后的 Echo 协议中的 lineReceived 中生成一个延迟对象。然后,我做了,addCallback(printData)。 printData 是一个向所有 Echo 实例广播数据的函数。问题是回调(结果),我无法从 MyPP 的 outReceived 中得到结果。延迟对象如何知道 outReceived 何时返回结果?我想知道我是否走在正确的轨道上。我正在研究的新方法是将调用 writeToChild 与将返回的延迟对象包装起来。然后我会在 outReceived 中触发回调。

标签: python twisted deferred


【解决方案1】:

您需要在您的ProcessProtocol 实现中实现childDataReceived(childFD, data)。当数据从子进程到达时,这将被回调。见the API docs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    相关资源
    最近更新 更多