运行基于非twisted的Python脚本,并使用twistd进行守护



我正在编写一个由服务器(使用Twisted)和客户端(不使用Twisted)组成的Python程序

服务器部分使用Twisted和Twisted的应用程序框架实现,并使用Twistd启动以进行守护。

运行在不同服务器上的客户端是一个简单的Python脚本,没有任何Twisted的东西(也没有特定于应用程序框架的东西)。它还应该作为守护进程运行。仅供参考,这是来源:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
import sys
import time
import syslog
SERVER_IP = '127.0.0.1' 
SERVER_PORT = 43278 
BEAT_PERIOD = 1
class HeartbeatClient:
    '''
    A Client sending heartbeats to a monitoring server.
    '''
    def __init__(self, server_ip, port, beat_period):
        syslog.syslog( ('Sending heartbeat to IP %s , port %d' +
                        'n press Ctrl-C to stopn') 
                        % (SERVER_IP, SERVER_PORT))
    def run(self):
        while True:
            hbSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            hbSocket.sendto('PyHB', (SERVER_IP, SERVER_PORT))
            if __debug__: 
                print 'Time: %s' % time.ctime()
            time.sleep(BEAT_PERIOD)
if __name__ == '__main__':
    hbc = HeartbeatClient() 
    hbc.run()

现在我想知道我是否可以守护客户端也与Twistd?因此,我将在客户端之外创建一个Twisted-Application。但是我看到的所有关于Twisted应用程序的例子都实现了一些Twisted internet-server的东西(比如我的例子internet.UDPServer…),而我的客户端并不使用这些东西。

那么是否可以使用Twistd将我的客户机作为守护进程启动,我需要做哪些更改?我应该重写客户端以充分利用Twisted吗?如果是,是否有类似的例子,如何编写一个基于Twisted的网络客户端?

或者我必须为客户机使用不同的守护进程库吗?有一个很好的库,但我试图保持一致,并为客户端和服务器使用相同的守护机制。

使用Twisted,作为tac文件,您的HeartbeatClient看起来像这样:

from twisted.application.service import Application, Service
from twisted.internet import reactor
from twisted.internet.task import LoopingCall
from twisted.internet.protocol import DatagramProtocol
class HeartbeatClient(Service):
    def startService(self):
        self._call = LoopingCall(self._heartbeat)
        self._call.start(BEAT_PERIOD)
    def stopService(self):
        self._call.stop()
    def _heartbeat(self):
        port = reactor.listenUDP(0, DatagramProtocol())
        port.write('PyHB', (SERVER_IP, SERVER_PORT))
        port.stopListening()
application = Application("PyHB")
HeartbeatClient().setServiceParent(application)

注意reactor.listenUDP的使用,即使您只发送UDP数据报,不接收任何数据报。UDP并没有客户端和服务器的概念,它只有开放的端口。所有UDP端口都可以发送和接收数据报。这就是为什么只有reactor.listenUDP,没有reactor.connectUDP

除此之外,LoopingCall为您提供了所需的循环,并将代码放入自定义Service子类中,使您可以在适当的时间启动和停止循环。

相关内容

  • 没有找到相关文章

最新更新