美文网首页
关于进程

关于进程

作者: 梦亦殇灬 | 来源:发表于2018-05-29 16:36 被阅读0次
    image

    Hello 进程

    代码在没有运行的时候叫程序 ,而运行着的代码叫进程
    一、fork函数 (注意,fork函数只能在Unix/Linux/Mac上运行windows不可以)

    #coding = utf-8
    import os
    f = os.fork()
    if f == 0:
        print("哈哈")#这是子进程
    else:
        print("嘿嘿")#这是父进程
    

    程序执行到fork时会自动创建子进程,复制父进程的所有信息到子进程
    父进程和子进程一定会从fork函数得到一个返回值 其中子进程的返回值一定是0 父进程的返回值是子进程的id号

    getpid() and getppid()

    #coding = utf-8
    import os
    f = os.fork()
    if f == 0:
        print("我是子进程%d,我的父进程是%d"%(os.getpid(),os.getppid()))
    else:
        print("我是父进程%d,我的子进程是%d"%(os.getpid(),f))
    

    Hello multiprocessing

    (解决在Windows用python编写多进程)

    #coding = utf-8
    from multiprocessing import Process #注意p大写
    import os
    import time
    def run_proc(name,age,**kwargs):
        print("子进程运行中---pid = %d name =%s age = %d"%(os.getpid(),name,age))
        print(kwargs)
    
    if __name__=="__main__":    
        p = Process(target = run_proc,args=("test",18,),kwargs={"laowang":"帮忙"})
        print("父进程开始")
        p.start()
        print("父进程等子进程结束")
        p.join()
        print("父子进程结束")
    

    Hello Pool(进程池)

    当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法。

    #coding =utf-8
    from multiprocessing import Pool
    def test(i):
        print("%d子进程开始执行"%i)
    
    if __name__ == '__main__':
        po = Pool(3)
        for i in range(10):
            po.apply_async(test,(i,))
            #po.apply(test,(i,))
        po.close()
        po.join()
    

    po.apply_async(test,(i,)) 此为非阻塞方式 Pool()创建了几个进程就一起执行几个
    po.apply(test,(i,)) 此为阻塞方式 不管Pool创建了几个,执行完一个在执行下一个

    Hello Queue(队列)

    进程间互通消息

    #coding=utf-8
    from multiprocessing import Queue
    q=Queue(4) #初始化一个Queue对象,最多可接收三条put消息
    q.put("消息1")
    q.put("消息2")
    q.put("消息3")
    if not q.full():
        q.put_nowait("消息4")
    else:
        print("消息列队已满,现有消息数量:%s"%q.qsize())
    #读取消息时,先判断消息列队是否为空,再读取
    if not q.empty():
        for i in range(q.qsize()):
            print(q.get_nowait())
    #Queue()初始化若括号中没有指定数量,代表可接受的消息没有上限,直到内存的尽头
    #方法 Queue.qsize():返回当前队列数量
    #    Queue.empty():若队列为空 返回True 否则返回 False
    #    Queue.full():若队列满了返回True 否则返回False
    

    如果要使用Pool创建进程,就需要使用multiprocessing.Manager()中的Queue()
    其余的和上面代码一样

    from multiprocessing import Manager,Pool
        #代码  
         #pass
      q=Manager().Queue() #使用Manager中的Queue来初始化
    

    各位小哥哥,小姐姐懂了吗?

    相关文章

      网友评论

          本文标题:关于进程

          本文链接:https://www.haomeiwen.com/subject/ygqajftx.html