Ich versuche, einen twisted-basierten Pika (RabbitMQ) Verbraucher in einen Dienst zu bekommen. Hier die entsprechenden Bits von dem, was ich zur Zeit in Kraft gesetzt habe:Umwandlung eines verdrillten Verbrauchers in einen Dienst
worker.py
import pika
from pika.adapters import twisted_connection
from twisted.internet import defer, reactor, protocol, task
@defer.inlineCallbacks
def run(connection):
channel = yield connection.channel()
yield channel.queue_declare(
queue='event_queue',
durable=True, auto_delete=False, exclusive=False
)
queue_object, consumer_tag = yield channel.basic_consume(
queue='event_queue', no_ack=False
)
l = task.LoopingCall(process, queue_object, connection)
l.start(0.01)
@defer.inlineCallbacks
def process(queue_object, connection):
ch, method, properties, body = yield queue_object.get()
if body:
print "Do stuff here"
yield ch.basic_ack(delivery_tag=method.delivery_tag)
def start():
parameters = pika.ConnectionParameters()
cc = protocol.ClientCreator(
reactor, twisted_connection.TwistedProtocolConnection, parameters
)
d = cc.connectTCP(MQ_SERVER, MQ_SERVER_PORT)
d.addCallback(lambda x: x.ready)
d.addCallback(run)
Dieser Arbeiter funktioniert gut, wenn mit dem folgende Skript ausführen:
runserver.py
import worker
from twisted.internet import reactor
if __name__ == '__main__':
worker.start()
reactor.run()
ich kann nicht, um herauszufinden, wie diese mit ot zur Arbeit kommen ihre Dienste in einer .tac-Datei.
services.tac
from twisted.application import service
application = service.Application("An application")
from other import get_service
other_service = get_service()
other_service.setServiceParent(application)
import worker
worker.start()
Diese tac-Datei funktioniert nicht, wenn es ausgeführt wird. Der gleiche Code ohne anderen Dienst scheint zu funktionieren, aber es scheint nicht zu funktionieren, wenn andere Dienste aktiviert sind. Stattdessen gibt es eine verzögerte Zeit zurück.
Gibt es eine Möglichkeit, dass ich diese connectTCP-Sache machen kann, die deffereds in einen regelmäßigen Dienst aufnimmt?
Ja, ich das tun. Nun, Systemd führt ein Skript aus, das twistd -ny services.tac ausführt. Es funktioniert, wenn es nur einen dieser Dienste vom Typ connectTCP gibt, oder wenn es eine beliebige Anzahl anderer TCPServer-basierter, wohldefinierter Dienste gibt (aus verdrehten Standards oder basierend auf ähnlichen Bibliotheken). Es bricht, wenn ich versuche, sie in die gleiche .tac zu bringen. –
Oft ist ein vollständiges Beispiel erforderlich, bevor jemand die Situation verstehen und eine korrekte Antwort geben kann. Erwägen Sie, alle fehlenden Informationen zu Ihrer Frage hinzuzufügen. –