Python, Rufen Sie eine Klasse Funktion aus einer anderen Klasse
Kann Sie jemand bitte helfen Sie mir (noob) rufen Sie die broadcast-Funktion aus der Klasse BroadcastServerFactory in Klasse Prozess, wie pro beigefügten code
Ich habe versucht, so viele Methoden zum aufrufen einer Funktion aus einer anderen Klasse, aber keine Lösung
import time, sys
from apscheduler.scheduler import Scheduler
import threading
import socket
from twisted.internet import reactor
from twisted.python import log
from twisted.web.server import Site
from twisted.web.static import File
from autobahn.websocket import WebSocketServerFactory, \
WebSocketServerProtocol, \
listenWS
class process(threading.Thread):
def __init__(self, buffer3):
threading.Thread.__init__(self)
self.setDaemon(True)
self.buffer3 = buffer3
def run(self):
factory.broadcast("I don't know what I'm doing!")
class BroadcastServerProtocol(WebSocketServerProtocol):
def onOpen(self):
self.factory.register(self)
def onMessage(self, msg, binary):
if not binary:
self.factory.broadcast("'%s' from %s" % (msg, self.peerstr))
def connectionLost(self, reason):
WebSocketServerProtocol.connectionLost(self, reason)
self.factory.unregister(self)
class BroadcastServerFactory(WebSocketServerFactory):
"""
Simple broadcast server broadcasting any message it receives to all
currently connected clients.
"""
def __init__(self, url, debug = False, debugCodePaths = False):
WebSocketServerFactory.__init__(self, url, debug = debug, debugCodePaths = debugCodePaths)
self.clients = []
self.tickcount = 0
self.tick()
def tick(self):
self.tickcount += 1
self.broadcast("'tick %d' from server" % self.tickcount)
reactor.callLater(1, self.tick)
def register(self, client):
if not client in self.clients:
print "registered client " + client.peerstr
self.clients.append(client)
def unregister(self, client):
if client in self.clients:
print "unregistered client " + client.peerstr
self.clients.remove(client)
def broadcast(self, msg):
print "broadcasting message '%s' .." % msg
for c in self.clients:
c.sendMessage(msg)
print "message sent to " + c.peerstr
class BroadcastPreparedServerFactory(BroadcastServerFactory):
"""
Functionally same as above, but optimized broadcast using
prepareMessage and sendPreparedMessage.
"""
def broadcast(self, msg):
print "broadcasting prepared message '%s' .." % msg
preparedMsg = self.prepareMessage(msg)
for c in self.clients:
c.sendPreparedMessage(preparedMsg)
print "prepared message sent to " + c.peerstr
def testing():
buffer2 - "hello"
myDisplay = process(buffer2)
myDisplay.start()
if __name__ == '__main__':
if len(sys.argv) > 1 and sys.argv[1] == 'debug':
log.startLogging(sys.stdout)
debug = True
else:
debug = False
level_scheduler = Scheduler()
level_scheduler.add_interval_job(testing, seconds=5)
level_scheduler.start()
#ServerFactory = BroadcastServerFactory
ServerFactory = BroadcastPreparedServerFactory
factory = ServerFactory("ws://localhost:9000",
debug = debug,
debugCodePaths = debug)
factory.protocol = BroadcastServerProtocol
factory.setProtocolOptions(allowHixie76 = True)
listenWS(factory)
webdir = File(".")
web = Site(webdir)
reactor.listenTCP(8080, web)
reactor.run()
Dank
InformationsquelleAutor Ossama | 2013-02-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Übergeben Sie die Instanz der Klasse von
BroadcastServerFactory
werden aufgerufen, um die Instanz der Klasse, es ruftprocess
auf die Bildungund dann nennen Sie es (es ist belegt wie
self.factory
imrun
- Anweisung. Ich kann nicht sehen, wo Sie einprocess
Klasse in Ihrem__main__
aber es wird erstellt, mit so etwas wieBeiseite: die Verwendung von Großbuchstaben für den Klassennamen ist gut in form als in python
process -> Process
Eine Sache zu beachten ist, dass die Verwendung von threading-sowohl in der Frage und in dieser Antwort ist wahrscheinlich falsch und funktioniert nur manchmal.
broadcast
ist nicht thread-sicher und muss aufgerufen werden, in dem gleichen threadreactor.run
genannt wird.InformationsquelleAutor danodonovan