Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python不同时打印两个并发线程_Python_Multithreading - Fatal编程技术网

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

我正在尝试用Python编写一个小型服务器包装器,在这个包装器中,我可以启动多个服务器并使它们在同一个终端中打印。每个进程将在一个线程中启动,并将标准输出打印到终端。下面是我的代码:

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库,可以为您进行底层处理。