Как течь в одну трубу (а не в серию) - PullRequest
0 голосов
/ 27 февраля 2019

Вполне возможно, что это вообще не проблема, а мое собственное неправильное понимание шаблона интерфейса.

Рассмотрим следующее tube:

@tube
class Capitalizer:
    def received(self, value):
        yield value.upper()

...и затем включив поток следующим образом:

@inlineCallbacks
def main(reactor, listenOn="unix:path=trying-tubes"):
    endpoint = clientFromString(reactor, listenOn)
    ipc_flow = yield flowFromEndpoint(endpoint)
    c = Capitalizer()
    ipc_flow.fount.flowTo(c)
    yield Deferred()

Я получаю: builtins.AttributeError: 'Capitalizer' object has no attribute 'flowStopped'

ОК, так что кажется, что я неправильно реализовал интерфейс tube.

Если я использую его как серию:

@inlineCallbacks
def main(reactor, listenOn="unix:path=trying-tubes"):
    endpoint = clientFromString(reactor, listenOn)
    ipc_flow = yield flowFromEndpoint(endpoint)
    c = Capitalizer()
    s = series(c)
    ipc_flow.fount.flowTo(s)
    yield Deferred()

... это нормально работает.

Итак, глядя в series(), я вижу, что он вызывает IDrainна моей трубке, которая, кажется, снабжает его стоком и другими необходимыми интерфейсами.

Если я попытаюсь передать его IDrain сам, я получу:

builtins.TypeError: ('Could not adapt', <__main__.Capitalizer object at 0x7fda958b8b70>, <InterfaceClass tubes.itube.IDrain>)

Это происходит потому, что менеджер контекста внутри series, который гласит:

    with _registryActive(_tubeRegistry):
        ...

... делает правильную фабрику (это _tube2drain) доступной в контексте.

Итак, я должен сам назвать какой-то вариант _tube2drain, если я хочу просто влиться в (и из) одного tube?

...