Python mutilprocessing Processing 父子进程共享文件对象

本文探讨了在Python的multiprocessing模块中,父子进程如何共享文件对象。通过示例代码展示了在多进程中文件写入的问题及原因,解释了标准IO库的缓冲特性,并提出了解决方案,包括写满缓冲区、手动调用flush()和设置无缓冲模式。文章还深入分析了进程退出时文件描述符的关闭和系统清理过程,以及os._exit()和sys.exit()的区别,建议遵循良好的编程实践以避免不规范的实现。
摘要由CSDN通过智能技术生成

multiprocessing python多进程模块, 于是, Processing也是多进程的宠儿. 但今天讨论的问题, 似乎也能引起我们一番重视

直接上代码:

from multiprocessing import Process, Lock
err_file = 'error1.log'  
err_fd = open(err_file, 'w')

def put(fd):
     print "PUT"
     fd.write("hello, func put write\n")
     print "END"

if __name__=='__main__':
    p_list=[]
    for i in range(1):
        p_list.append(Process(target=put, args=(err_fd,)))    
    for p in p_list:
        p.start()
    for p in p_list:
        p.join()

上面的代码意图很清晰: 通过multiprocessing.Process派生一个进程, 去执行put函数, put函数的作用也是很清楚, 输出PUT和END, 并且将”hello, func put write” 写到文件error1.log中.

那么按理说, 输出应该如同上面说的那样, PUT和END,然后error1.log将有那句话”hello, func put write”, 然而, 世事总有那么点难料的, 代码执行结果是:

[root@iZ23pynfq19Z ~]# py27 2.py ; cat error1.log 
PUT
END
[root@iZ23pynfq19Z ~]#

what!? 为什么error1.log没东西 !?

让我们稍微调整下代码, 再见证神奇的事情:

from multiprocessing import Process, Lock
err_file = 'error1.log'  
err_fd = open(err_file, 'w')

def put(fd):
     print "PUT"
     fd.write("hello, func put write\n")
     fd.write("o" * 
  • 14
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个关于 Python 进程间共享对象的问题。在 Python 中,我们可以通过使用 `multiprocessing.Manager` 类来创建一个自定义的共享对象管理器。这个管理器可以管理一些共享的对象,比如列表、字典、队列等等。 首先,我们需要导入相关的模块: ```python from multiprocessing import Process, Manager ``` 然后,我们可以创建一个自定义的共享对象管理器: ```python manager = Manager() ``` 接着,我们可以使用这个管理器来创建共享对象,比如一个共享列表: ```python shared_list = manager.list() ``` 现在,我们就可以在多个进程之间共享这个列表了。比如,我们可以创建两个进程来同时向这个列表中添加元素: ```python def add_element(shared_list, element): shared_list.append(element) if __name__ == '__main__': shared_list = manager.list() p1 = Process(target=add_element, args=(shared_list, 1)) p2 = Process(target=add_element, args=(shared_list, 2)) p1.start() p2.start() p1.join() p2.join() print(shared_list) ``` 这个例子中,我们创建了两个进程 `p1` 和 `p2`,它们都会调用 `add_element` 函数来向共享列表中添加元素。最后,我们打印出这个共享列表的内容,可以看到它包含了元素 1 和 2。 这就是一个简单的 Python 进程间共享对象的示例。通过使用 `multiprocessing.Manager` 类,我们可以轻松地创建自定义的共享对象管理器,并在多个进程之间共享对象

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值