我试图在Python中编写一个小型服务器包装器,我可以在其中启动多个服务器并使它们在同一个终端中打印。每个进程都将在一个线程中启动,并将stdout打印到终端。以下是我的代码:
class Server():
def __init__(self,name,args):
self.name = name
self.args = shlex.split(args)
self.started = False
def start(self):
threading.Thread(target=self.__start).start()
def __start(self):
print(bcolors.HEADER+"{}: INFO: Server started.".format(self.name)+bcolors.ENDC)
self.started = True
self.p = subprocess.Popen(self.args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout_list = []
while True:
stdout = self.p.stdout.readline()
if stdout == '' and self.p.poll() != None:
break
else:
if not stdout == '':
stdout_list.append(stdout)
stdout = stdout.rstrip()
print("{}: STDOUT: {}".format(self.name,stdout))
stderr = self.p.stdout.readline()
if stderr != '':
print(bcolors.WARNING+"{}: STDERR: {}".format(self.name,stderr)+bcolors.ENDC)
print(bcolors.HEADER+"{}: INFO: Server closed.".format(self.name)+bcolors.ENDC)
self.start = False
return ''.join(stdout)
def interrupt(self):
if self.started == True:
self.p.send_signal(signal.SIGINT)
else:
print("Server not started.")
def terminate(self):
if self.started == True:
self.p.kill()
else:
print("Server not started.")
t=Server("Test","python testserver.py")
t2=Server("Test2","python testserver.py")
t.start()
t2.start()
testserver.py是一个简单的脚本,打印1-3,每秒打印一次,每次刷新标准输出。它只是在这里测试程序是否可以同时托管和打印东西。
如果只执行t.start(),主脚本工作正常,它将逐个打印1-3,并且它也从一个线程运行,因此它之后的任何代码都可以工作。然而,当我添加t2.start()时,我得到了混合的结果。
user@desktop:~/Documents/home automation$ python serverhost.py
Test: INFO: Server started.
Test2: INFO: Server started.
Test: STDOUT: 1
Test2: STDOUT: 1
Test: STDOUT: 2
Test2: STDOUT: 2
Test: STDOUT: 3
Test2: STDOUT: 3
Test: INFO: Server closed.
Test2: INFO: Server closed.
有时候
user@desktop:~/Documents/home automation$ python serverhost.py
Test: INFO: Server started.
Test2: INFO: Server started.
Test: STDOUT: 1
Test: STDOUT: 2
Test: STDOUT: 3
Test: INFO: Server closed.
Test2: STDOUT: 1
Test2: STDOUT: 2
Test2: STDOUT: 3
Test2: INFO: Server closed.
当主机退出时,来自Test2的STDOUT全部显示(非实时)。
任何人都知道发生了什么?我认为如果它不起作用,它至少应该是一致的。
答案 0 :(得分:0)
您可能希望使用semaphors同步线程。但我建议你掌握一些关于Concurrency的基本知识。
答案 1 :(得分:0)
线程并发 对于parellel编程,您需要使用多处理
并发 是指两个或多个任务可以在重叠的时间段内启动,运行和完成。它并不一定意味着它们都会在同一时刻运行。例如。在单核机器上进行多任务处理。
并行 是指任务在同一时间运行,例如。在多核处理器上。
CPython解释器上的Python 不支持通过多线程实现真正的多核执行
详细信息: check this blog