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