zoukankan      html  css  js  c++  java
  • Python学习笔记(四)多进程的使用

    python中多进程与Linux 下的C基本相同。

    fork的基本使用

    先看最简单的例子:

    # coding: utf-8
    import os
    
    def my_fork():
        pid = os.fork()
        if pid == 0:
            print 'this is child, pid = %d, parent id = %d' % (os.getpid(), os.getppid())
        elif pid > 0:
            print 'this is parent, pid = %d, child id = %d' % (os.getpid(), pid)
            os.waitpid(pid, 0) #等待子进程结束
    
    if __name__ == '__main__':
        my_fork()

    这个例子演示了fork的基本使用,还有就是我们最后使用了waitpid来回收子进程。

    如果不知道具体的子进程号码,可以使用wait函数。

    管道pipe的使用

    代码如下:

    # coding: utf-8
    import os
    from time import sleep
    
    def my_fork():
        r, w = os.pipe()
        pid = os.fork()
        if pid == 0:
            os.close(r) #关闭读端
            w = os.fdopen(w, "w")
            for i in range(10):
                w.write('%s
    ' % (str(i+1))) #最后加上
    
                w.flush()  #这里记得刷新
                sleep(0.5)
            w.close()
        elif pid > 0:
            os.close(w) #关闭写端
            r = os.fdopen(r, "r")
            while True:
                data = r.readline() #不要使用read
                if not data:
                    print 'close.'
                    break;
                print 'received : %s' % (data)
            os.waitpid(pid, 0)  #等待子进程结束
    
    if __name__ == '__main__':
        my_fork()

    在子进程中,连续10次发送数字。

    这里有几点值得注意:

    write时加上 符号

    接收时使用readline函数

    每发送完一个数据,就刷新flush一次缓冲区

    使用信号处理僵尸进程

    Python中也可以使用信号处理函数,例如最简单的中断信号:

    # coding: utf-8
    import os
    import signal
    from time import sleep
    
    def handler(a, b):
        print 'Ctrl + C'
    
    if __name__ == '__main__':
        signal.signal(signal.SIGINT, handler)
        while True:
            pass

    每按一次Ctrl+C,就触发一次这个函数。

    代码如下:

    # coding: utf-8
    import os
    import signal
    from time import sleep
    
    def handler(a, b):
        (pid, status) = os.wait()
        print 'Child %d Finish, status = %d' % (pid, status)
    
    def my_fork():
        pid = os.fork()
        if pid == 0:
            print 'this is child, pid = %d, parent id = %d' % (os.getpid(), os.getppid())
        elif pid > 0:
            print 'this is parent, pid = %d, child id = %d' % (os.getpid(), pid)
            
            while True:
                pass
    
    if __name__ == '__main__':
        signal.signal(signal.SIGCHLD, handler)
        my_fork()
    每当有子进程消亡,就触发SIGCHLD信号,然后在处理函数中调用wait函数。这里比Linux下简单,不必使用while循环回收

    下节使用python,编写一个多进程的并发服务器。

    完。

  • 相关阅读:
    Log4j appender、layout
    EhCache缓存框架的使用
    Log4j rootLogger根配置以及4种日志级别
    开发chrome 插件, background.js中 console log 看不到解决方法
    Windows cmd 长时间不输出新内容 直到按下ctrl + c 取消或者回车的解决办法
    如何查看当前分支从哪个支线创建而来
    C# 获取相对路径的字符串
    解决adobe air sdk打包 apk后自动在包名前面加上air. (有个点)前缀的问题
    sublime text 输入法候选词不跟随光标
    Windows 批处理设置dns ,解决能上qq不能开网页
  • 原文地址:https://www.cnblogs.com/inevermore/p/4093561.html
Copyright © 2011-2022 走看看