zoukankan      html  css  js  c++  java
  • python进程

    进程                                                                                                                     

    进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源费配和调度的基本单位,是操作系统结构的基础。在当代面向线程设计的计算机结构中,进程是线程的容器,同一个进程中的多个线程可以共享其资源,而进程与进城之间可以起到数据隔离的作用(即同一个程序执行两次,就会在操作系统出现两个进程,所以同时运行同一个软件做不同的事情也不会混乱)。

    进程的并行和并发                                                                                                                       

    并行:是指两者同时进行,微观上,就是在一个时刻,有不同的程序执行,要求必须有多个处理器。

    并发:是指系统资源有限,两者只能交替轮流使用资源,目的是为了提高效率,从宏观上看某个时刻是同时进行的。

    同步、异步、阻塞、非阻塞                                                                                                     

     同步和异步:       

      同步就是一个任务的完成需要依赖另一个任务时,只有等待被依赖的任务完成后,依赖的任务才算完成,这是一种可靠的任务序列。成功都成功,失败都失败,两个任务的 状态保持一致。

            异步(回调机制)是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么操作,依赖的任务也立即执行,自己完成了整个任务就算完成了。至于被依赖的任务是否完成,依赖他的任务无法确定,所以这是一种不可靠的任务序列。

    阻塞和非阻塞:

      阻塞:就是等待。

      非阻塞:不等待。  

      比如创建socket对某个地址进行connect、获取接收数据recv时默认都会等待(连接成功或接收到数据),才执行后续操作。
      如果设置setblocking(False),以上两个过程就不再等待,但是会报BlockingIOError的错误,只要捕获即可。

      使用process模块创建进程            

     在Windows操作系统中由于没有fork(linux操作系统中创建进程的机制),在创建子进程的时候会自动 import 启动它的这个文件, 而在 import 的时候又执行了整个文件。
    因此如果将process()直接写在文件中就会无限递归创建子进程报错。 所以必须把创建子进程的部分使用if __name__ ==‘__main__’ 判断保护起来,import 的时候 ,就不会递归运行了。 
    import time
    from multiprocessing import Process
    
    def f(n):    
        print(n)
        print('子进程')
    
    if __name__ == '__main__':
        p = Process(target=f, args=(666,))
        p.start()
        time.sleep(1)
        print('主进程')
    创建子进程
    import time
    from multiprocessing import Process
    
    def f(name):
        print('hello', name)
        time.sleep(1)
        print('子进程')
    if __name__ == '__main__':
        p = Process(target=f, args=('bob',))
        p.start()
        p.join()
        print('父进程')
    join

    继承创建进程:

    def task(n):
        n+=1
        print(n)
    if __name__ == '__main__':
        for i in range(3):
            p=Process(target=task,args=(i,))
            p.start()
    View Code

    进程之间的数据隔离:

    class MyProcess(Process):
        def __init__(self,name):
            super().__init__()
            self.name=name
        def run(self):
            print(os.getpid())
            print(self.name)
    if __name__ == '__main__':
    
        p1=MyProcess('messi')
        p2=MyProcess('c罗')
        p3=MyProcess('salah')
    
        p1.start() #start会自动调用run
        p2.start()
        p3.start()
    
        p1.join()
        print(os.getppid())
    View Code

    进程之间的数据共享:

      Queue:

    import multiprocessing
    
    def task(arg,q):
        q.put(arg)
    if __name__ == '__main__':
        q = multiprocessing.Queue()
        for i in range(5):
            p=multiprocessing.Process(target=task,args=(i,q))
            p.start()
        while True:
            v=q.get()
            print(v)
    示例

      Manager:

    import multiprocessing
    import time
    
    def task(arg,dic):
        time.sleep(2)
        dic[arg]=100
    if __name__ == '__main__':
        m=multiprocessing.Manager()
        dic=m.dict()
        process_list=[]
        for i in range(5):
            p=multiprocessing.Process(target=task,args=(i,dic))
            p.start()
            process_list.append(p)
        while 1:
            count=0
            for p in process_list:
                if not p.is_alive():
                    count+=1
            if count == len(process_list):
                break
        print(dic)
    示例

    进程池:

    import time
    from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
    
    def task(arg):
        time.sleep(2)
        print(arg)
    
    if __name__ == '__main__':
        pool = ProcessPoolExecutor(5)
        for i in range(10):
            pool.submit(task,i)
    进程池

      

  • 相关阅读:
    centos7上搭建FTP(简单版)教程
    IDEA 添加外部jar包
    linux下搭建本地yum源
    Linux下 正则表达式的用法
    linux下rename用法--批量重命名
    Homebrew 常用命令
    纯内网环境下搭建zabbix
    windows下 批量修改文件名
    【转】git 的常用命令
    [转]linux 下 正则表达式的用法
  • 原文地址:https://www.cnblogs.com/feifeifeisir/p/9643264.html
Copyright © 2011-2022 走看看