如何在永久循环中停止等待从套接字接收的greenlet

2024-04-23 23:17:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在Python应用程序中编写一个简单的模块来与服务器通信。我使用gevent和zeromq套接字。此模块将在线程中运行。你知道吗

这是一个演示

import threading
import gevent
import zmq.green as zmq


class SocketTest(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.context = zmq.Context()
        self.socket = None
        self.running = False
        self.sock_greenlet = None

    def run(self):
        self.socket = self.context.socket(zmq.DEALER)
        self.socket.setsockopt(zmq.RCVTIMEO, 1000)
        self.socket.connect('tcp://127.0.0.1:9999')

        self.running = True
        self.sock_greenlet = gevent.spawn(self.process)
        print('Starting')
        self.sock_greenlet.join()

    def process(self):
        while self.running:
            print('Wait for data')
            data = self.socket.recv()
            # do something
            print(data)
            gevent.sleep(0.5)

    def stop(self):
        print('Stop app')
        self.running = False
        # I want to ask all greenlets to exit, or kill them
        # gevent.wait(timeout=0)
        gevent.kill(self.sock_greenlet)
        print('End of stop')


def test():
    try:
        app = SocketTest()
        app.start()
        app.join()
    except KeyboardInterrupt:
        app.stop()
        print('Exit')


if __name__ == '__main__':
    test()

当我按Ctrl+C时,我的应用程序不会退出。我知道我的线程正在运行一个事件循环。但是我不知道如何正确地阻止greenletprocess,或者杀死它。你知道吗

在主线程中,我将调用app.stop,如果我访问gevent循环的一些变量是否安全? (我想在我的应用程序退出时向服务器发送goodbye消息)


Tags: importselfapp应用程序datadefgeventsocket
1条回答
网友
1楼 · 发布于 2024-04-23 23:17:08

我在所有的项目中都用这个,效果很好。你知道吗

if __name__ == '__main__':
    server = WSGIServer(("0.0.0.0", int(port)), app , handler_class=WebSocketHandler)
    def shutdown():
        print('Shutting down ...')
        server.stop(timeout=60)
        exit(signal.SIGTERM)
    gevent.signal(signal.SIGTERM, shutdown)
    gevent.signal(signal.SIGINT, shutdown) #CTRL C
    server.serve_forever()

相关问题 更多 >