Python:多进程安全写入标准输出

Python:多进程安全写入标准输出,python,multiprocessing,subprocess,stdout,Python,Multiprocessing,Subprocess,Stdout,我有一个从子进程读取标准输出的主脚本,其中子进程是一个python2脚本,它生成一个工作池(所有工作都打印到标准输出)。下面做了一个简单的脚本供参考 这个多进程安全吗?当我使用python3main.py>test.txt运行下面的代码时,验证输出是否正常,没有混杂的结果。另外,即使我注释掉了py2script.py中的锁(acquire and release),它似乎仍然可以正常工作。即使我尝试更大的数字,似乎仍然可以 我没有使用队列的主要原因是因为print语句实际上是嵌套在多个函数调用中

我有一个从子进程读取标准输出的主脚本,其中子进程是一个python2脚本,它生成一个工作池(所有工作都打印到标准输出)。下面做了一个简单的脚本供参考

这个多进程安全吗?当我使用
python3main.py>test.txt运行下面的代码时,验证输出是否正常,没有混杂的结果。另外,即使我注释掉了
py2script.py
中的锁(
acquire and release
),它似乎仍然可以正常工作。即使我尝试更大的数字,似乎仍然可以

我没有使用队列的主要原因是因为print语句实际上是嵌套在多个函数调用中的,这意味着我不想将队列传递给多个函数。基本上,它需要大量的代码更改,将打印语句添加到这些特定函数中要容易得多

简而言之,这样的架构安全吗?甚至不用锁?还是为了安全起见我应该用锁?如果这不是建议的或不是多进程安全的,我可以做什么其他选择?理想情况下,不需要向函数传递新参数,因为如上所述,它嵌套在函数中,可能需要大量代码更改

在main.py中

import subprocess


class Py2Reader():
    def __init__(self, *args):
        self.proc = subprocess.Popen(['python2', *args], stdout=subprocess.PIPE)

    def __iter__(self):
        return self

    def __next__(self):
        while True:
            line = self.proc.stdout.readline()
            if not line:
                raise StopIteration
            return line


p = Py2Reader("py2script.py")
for line in p:
    print(line)
在py2script.py中

import multiprocessing
import multiprocessing as mp
import sys

#l = multiprocessing.Lock()


def test_func(i):
    end = 1000
    for x in range(end):
        #l.acquire()
        print("process {} printing {}".format(i, x))
        sys.stdout.flush()
        #l.release()


def main():
    pool = mp.Pool(4)
    for i in range(5):
        pool.apply_async(test_func, args=(i,))
    pool.close()
    pool.join()


if __name__ == "__main__":
    multiprocessing.freeze_support()
    main()