Python两个并发线程不能同时打印

时间:2017-09-09 06:59:15

标签: python multithreading

我试图在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全部显示(非实时)。

任何人都知道发生了什么?我认为如果它不起作用,它至少应该是一致的。

2 个答案:

答案 0 :(得分:0)

您可能希望使用semaphors同步线程。但我建议你掌握一些关于Concurrency的基本知识。

答案 1 :(得分:0)

线程并发 对于parellel编程,您需要使用多处理

并发 是指两个或多个任务可以在重叠的时间段内启动,运行和完成。它并不一定意味着它们都会在同一时刻运行。例如。在单核机器上进行多任务处理。

并行 是指任务在同一时间运行,例如。在多核处理器上。

CPython解释器上的

Python 不支持通过多线程实现真正的多核执行

详细信息: check this blog

check this answer