How can I write a socket server in a different thread from my main program (using gevent)?

前端 未结 1 919
逝去的感伤
逝去的感伤 2020-12-22 02:26

I\'m developing a Flask/gevent WSGIserver webserver that needs to communicate (in the background) with a hardware device over two sockets using XML.

One socket is in

相关标签:
1条回答
  • 2020-12-22 03:29

    Hope it can provide some help, In example class if we will call tenMessageSender function then it will fire up an async thread without blocking main loop and then _zmqBasedListener will start listening on separate port untill that thread is alive. and whatever message our tenMessageSender function will send, those will be received by client and respond back to zmqBasedListener.

    Server Side

    import threading
    import zmq
    import sys
    
    class Example:
        def __init__(self):
            self.context = zmq.Context()
            self.publisher = self.context.socket(zmq.PUB)
            self.publisher.bind('tcp://127.0.0.1:9997')
            self.subscriber = self.context.socket(zmq.SUB)
            self.thread = threading.Thread(target=self._zmqBasedListener)
    
        def _zmqBasedListener(self):
            self.subscriber.connect('tcp://127.0.0.1:9998')
            self.subscriber.setsockopt(zmq.SUBSCRIBE, "some_key")
            while True:
                message = self.subscriber.recv()
                print message
            sys.exit()
    
        def tenMessageSender(self):
            self._decideListener()
            for message in range(10):
                self.publisher.send("testid : %d: I am a task" %message)
    
        def _decideListener(self):
            if not self.thread.is_alive():
                print "STARTING THREAD"
                self.thread.start()
    

    Client

    import zmq
    context = zmq.Context()
    
    subscriber = context.socket(zmq.SUB)
    subscriber.connect('tcp://127.0.0.1:9997')
    publisher = context.socket(zmq.PUB)
    publisher.bind('tcp://127.0.0.1:9998')
    subscriber.setsockopt(zmq.SUBSCRIBE, "testid")
    count = 0
    print "Listener"
    while True:
        message = subscriber.recv()
        print message
        publisher.send('some_key : Message received %d' %count)
        count+=1
    

    Instead of thread you can use greenlet etc.

    0 讨论(0)
提交回复
热议问题