python 3、运行 不同循环同时进行的最佳方法是什么?

python 3, what is the best way to run different loops simultaneously?

我有一个套接字服务器,所以它一直在循环并检查套接字上收到的任何数据。 如果在套接字连接上收到 b'Go' 命令,我想开始另一个循环,每 5 秒打印一次“Going ...”。 如果在套接字连接上收到 b'Stop' 命令,我想启动另一个打印“Sitting ...”一次的循环。 然后套接字连接保持监听。

我尝试了以下但现在被阻止了。感谢您的帮助。

import socket
import threading
import time

class SimpleServer:
    def __init__(self, port):
        self.host = socket.getfqdn()
        self.port = port
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.settimeout(None)
        self.client_sockets = []

    def initialise(self):
        try:
            self.sock.bind((self.host, self.port))
        except socket.error:
            return
        self.sock.listen(5)
        self.server_thread = threading.Thread(target=self.serve_forever)
        self.server_thread.setDaemon(True)
        self.server_thread.start()

    def serve_forever(self):
        try:
            request, client_address = self.sock.accept()
            with request:
                while True:
                    data = request.recv(1024)
                    if not data:
                        break

                    data = data.decode("utf-8").strip()
                    if data == 'Go':
                        # Start another thread to print "Going ..." every 1 minute 
                        # without blocking receiving new data on the socket
                        # prevent using subprocess.call if possible
                        ????????
                    elif data == 'Stop':
                        print('Sitting ...')
        except socket.error:
            return



if __name__ == '__main__':
    server = SimpleServer(args.socket_port)
    server.initialise()
    server.serve_forever()

您走在正确的轨道上。只需创建一个函数来执行工作并创建更多线程。例如:

import socket
import threading
import time

class SimpleServer:
    def __init__(self, port):
        self.port = port
        self.sock = socket.socket()

    def initialise(self):
        self.sock.bind(('', self.port))
        self.sock.listen()
        self.server_thread = threading.Thread(target=self.serve_forever,daemon=True)
        self.server_thread.start()
        self.run = False                  # Track running Go thread

    def worker(self):                     # Go thread worker
        while self.run:
            print(' Go',end='',flush=True)
            time.sleep(1)

    def serve_forever(self):
        client, client_address = self.sock.accept()

        # Wrap socket in a file-like object.  TCP is not a message-based protocol
        # so you have to delimit messages in some manner.  I'm using newline
        # To indicate end-of-message.
        request = client.makefile('r',encoding='utf8')

        with client,request:  # To ensure socket and makefile wrapper close
            while True:
                data = request.readline()  # Read to newline for a message
                if not data:
                    break

                data = data.strip()
                if data == 'Go' and not self.run:
                    self.run = True
                    self.worker_thread = threading.Thread(target=self.worker,daemon=True)
                    self.worker_thread.start()
                elif data == 'Stop':
                    self.run = False
                    self.worker_thread.join()
                    print(' Sitting ...')

def client():
    s = socket.socket()
    s.connect(('localhost',5000))
    s.sendall(b'Go\n')
    time.sleep(5)
    s.sendall(b'Stop\n')

if __name__ == '__main__':
    server = SimpleServer(5000)
    server.initialise()
    t = threading.Thread(target=client,daemon=True)
    t.start()

    # All threads are daemons, and will terminate if main thread exits.
    input('hit enter to quit server...')

输出:

hit enter to quit server... Go Go Go Go Go Sitting ...