Python不同时打印两个并发线程
我正在尝试用Python编写一个小型服务器包装器,在这个包装器中,我可以启动多个服务器并使它们在同一个终端中打印。每个进程将在一个线程中启动,并将标准输出打印到终端。下面是我的代码:Python不同时打印两个并发线程,python,multithreading,Python,Multithreading,我正在尝试用Python编写一个小型服务器包装器,在这个包装器中,我可以启动多个服务器并使它们在同一个终端中打印。每个进程将在一个线程中启动,并将标准输出打印到终端。下面是我的代码: class Server(): def __init__(self,name,args): self.name = name self.args = shlex.split(args) self.started = False def start(se
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()
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会立即显示(不是实时显示)
有人知道发生了什么吗?我想,如果它不起作用,它至少应该是一致的。您可能需要使用来同步线程。但是我建议您了解一些关于的基本知识。您可能希望使用来同步线程。但是我建议您了解一些基本知识。线程是并发的 对于并行编程,您需要使用多处理 并发性是指两个或多个任务可以在重叠的时间段内启动、运行和完成。这并不一定意味着它们会同时运行。在单核机器上进行多任务处理 并行性是指任务实际上同时运行,例如在多核处理器上 Python解释器上的Python不支持通过多线程执行真正的多核执行 详情如下:
线程是并发的 对于并行编程,您需要使用多处理 并发性是指两个或多个任务可以在重叠的时间段内启动、运行和完成。这并不一定意味着它们会同时运行。在单核机器上进行多任务处理 并行性是指任务实际上同时运行,例如在多核处理器上 Python解释器上的Python不支持通过多线程执行真正的多核执行 详情如下:
它们不应该同时打印。线程是异步的,这是怎么回事?我想它们会的,因为它们是线程化的。你能简化一下像def u start()这样的u start()函数吗:对于范围(3)中的i:打印(i)睡眠(1)?@Trevor,阅读一下线程是如何实际执行的。具体来说,请阅读Python的线程模型。处理器实际上非常快速地在线程之间切换以完成任务。因此,无法保证任务的每一部分何时会在其他线程上执行。目前,我将使用systemd作为替代方案,但我仍然不知道为什么上面的方法不起作用。Pyro()是一个神奇的python库,它为您执行低级处理。它们不应该同时打印。线程是异步的,这是怎么回事?我想它们会的,因为它们是线程化的。你能简化一下像def u start()这样的u start()函数吗:对于范围(3)中的i:打印(i)睡眠(1)?@Trevor,阅读一下线程是如何实际执行的。具体来说,请阅读Python的线程模型。处理器实际上非常快速地在线程之间切换以完成任务。因此,无法保证任务的每一部分何时会在其他线程上执行。目前,我将使用systemd作为替代方案,但我仍然不知道为什么上面的方法不起作用。Pyro()是一个神奇的python库,可以为您进行底层处理。