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 ...
我有一个套接字服务器,所以它一直在循环并检查套接字上收到的任何数据。 如果在套接字连接上收到 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 ...