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,编写一个多进程的并发服务器。

    完。

  • 相关阅读:
    Java线程安全和非线程安全
    时间戳获取(周,年,月,日)
    spring+spring 日志输出
    Spring+springMvc+Mybatis
    关于mysql处理百万级以上的数据时如何提高其查询速度的方法
    Tomcat 详解
    理解 $_POST、$_GET 、php://input
    php编译参数注解--不明白许多参数的作用 慎用 –with-curlwrappers参数【转载】
    centos6.5编译安装php[整理一]
    ubuntu16.04 安装chrome 和 phpstorm
  • 原文地址:https://www.cnblogs.com/inevermore/p/4093561.html
Copyright © 2011-2022 走看看