138 python|第八部分:并发网络编程多任务编程上--进程

Posted 缓缓而行

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了138 python|第八部分:并发网络编程多任务编程上--进程相关的知识,希望对你有一定的参考价值。

-ef | grep 进程关键字
显示指定用户信息
  • -u 用户名
    显示进程树形结构

  • print("The old process") sleep(2) print("func01 over") sleep(3) print("func02 over") print("error") func01() func02()
    终端运行:

    print("error") print("child pid:",os.getpid())#获取当前进程(子进程)的进程号 print("parent pid", os.getppid())#获取父进程的进程号 print("parent pid",os.getpid())#获取当前进程(父进程)的进程号 print("child pid:",pid)#父进程的返回值是子进程的 pid
    执行结果:

    sleep(1)#给子进程设置等待时间,确保父进程先结束 print("child pid:",os.getpid())#获取当前进程(子进程)的进程号 print("parent pid", os.getppid())#获取父进程的进程号



    2.僵尸进程
    一个进程创建子进程,如果pid < print(pid== print( os._exit( p,status = os.wait() print( print( print( sleep(2) print("func01") sleep(3) print("func02") print("error") pid_0 = os.fork()#二级子进程 if pid_0 ==0: func01()#执行二级子进程 else:#一级子进程 os._exit(0)#在创建完二级子进程后直接退出 os.wait() func02()#等一级子进程结束,执行这句
    终端运行:大概花费3秒就能结束运行,而且不会产生僵尸进程


    3.通过信号处理子进程退出
    原理:子进程退出时会发送信号给父进程,如果父进程忽略子进程的信号,系统就会自动处理子进程退出。
    方法:使用signal模块在父进程创建子进程前写出以下语句:
    import signal
    print("error") print("child process",os.getpid()) os._exit(0) while True: pass
    运行:


    multiprocessing Processostime sleep sleep( print(os.getppid(), sleep( print(os.getppid(), sleep( print(os.getppid(),th [fun1,fun2,fun3]: p = Process(target=th) jobs.append(p) p.start()i jobs: i.join()
    运行:


    for i in range(3): sleep(sec) print("I\'m %s"%name) print("I\'m working...")multiprocessing Processos fr = open(filename, fw = open( n = size // fw.write(fr.read(n)) fr.close() fw.close() fr = open(filename, fw = open( fr.seek(size// fw.write(fr.read()) fr.close() fw.close() print( print( __name_== p = MyProcess( p.start() p.join()

    下面代码 start_time = time.time() res=f(*args,**kwargs) end_time=time.time() print(% (f.__name_ res wrapper n<= False i range( n % i == False True prime = [] i range( ifprime(i) prime.append(i) sum(prime) = = i range( ifprime(i): sum( prime = [] processes = [] i range( p = prime2(prime,i,i+ p.start() processes.append(p) [process.join() process processes] prime = [] processes = [] i range( f = prime2(prime,i,i+ f.start() processes.append(f) [process.join() process processes]__name_== use10_multi_process()给func函数以字典形式位置传参
    事件函数
    multiprocessing Pool
    time sleepos sleep( print(os.getpid(), msgi range( msg = r = pool.apply_async(func=fun,args=(msg,))multiprocessing Pooltime sleep sleep( print( n * n当block为True表示超时时间
    注:block和timeout二选一
    get([block,timeout])
    multiprocessing Process,Queuetime sleep i range( sleep( q.put( print(q.get(timeout= return
    p1 = Process(target=bar)#进程1p2 = Process(target=foo)#进程2p1.start()#开启进程1p2.start()#开启进程2p1.join()#回收进程1p2.join()#回收进程2

    实例:
  • """使用进程池拷贝一个目录及目录中的所有内容目录中的内容均为普通文件;进程池中执行的每个进程事件拷贝一个文件实时显示拷贝的百分比拷贝目录:/home/huanhuan/myfile/target"""

    运行:定义main函数后
    此时创建了一个新的空目录target_备份,里面还没有原target中的文件:


    原目录中的文件此时已全部被拷贝到新目录target_备份中:
    创建消息队列:
    计算目录大小:
    显示拷贝文件的百分比:

    注:1.使用fork函数和multiprocessing包两种方式实现的简单聊天室功能,可以在公众号后台输入“聊天室f”和“聊天室m”获取代码;2.上面这个实例(拷贝目录)的代码可以在后台输入“拷贝目录”获取。


    ▍下期预告:线程





    参考资料


    [1] multiprocessing --- 基于进程的并行
    https://docs.python.org/zh-cn/3/library/multiprocessing.html
    [2] python多进程的理解 multiprocessing Process join run
    https://www.cnblogs.com/lipijin/p/3709903.html
    [3] Python中的进程与multiprocessing模块(包)
    https://blog.csdn.net/qq_25171075/article/details/81871537
    [4] Python进程和线程,1个台机子多只手干活的秘籍!
    https://mp.weixin.qq.com/s/eIAd107SY51jvb-NLIIbIA
    [5] Python之进程
    https://www.cnblogs.com/clschao/articles/9629392.html
    [6] Python多进程编程
    https://www.cnblogs.com/kaituorensheng/p/4445418.html


    花样早餐展

    139 python|第八部分:并发网络编程多任务编程下--线程

    threading Threadtime sleep i range( sleep( print(i range( sleep(threading Threadtime sleep print( sleep(sec) print(i range( t = Thread(target = func, args = ( kwargs = ) t.start()threading Threadtime sleep self.song = song super().__init__() i range( sleep( print(threading Threadfrom time sleepthreadingtime print(% threading.currentThread().getName()) event.wait() print(% threading.currentThread().getName())threading Thread,Lock lock.acquire() a != b: print( lock.release() lock.acquire() a += b += lock.release()time sleep self.id = id self.balance = balance self.balance -= amount self.balance += amount self.balance from_.lock.acquire() from_.get(amount) sleep( to.lock.acquire() to.put(amount) from_.lock.release() to.lock.release() #一方给另一方转钱trans(Peiqi,George,10)
    print(\'Peiqi:\',George.getbalance())print(\'George:\',Peiqi.getbalance())
    运行结果:
    在这段代码中,场景是一方给另一方转钱,程序运行没有问题。


    但是如果两方同时向对方转钱,会出现阻塞。

    阻塞的原因是产生了死锁。根据上面提到的死锁的避免方式,我们只要让死锁四个产生条件不要同时出现即可。


    这题可以通过破坏“请求和保持条件”入手。可以让出钱一方上锁-取钱后直接进行解锁来实现需求。

    运行结果:




    05 GIL(global interpreter lock)问题 


            

    5.1 概念

      
    ▍GIL(全局解释器锁)概念
    为了利用多核,Python利用支持多线程,为了解决多线程之间数据完整性和状态同步的问题,python通过加锁的方式来处理(通过GIL给解释器加锁,让解释器同一时刻只能解释一个线程)。

    但这也大大降低了线程的执行效率,因为遇到阻塞时线程会主动让出解释器,去解释其他线程。所以python在执行多阻塞任务时可以提升程序效率,其他情况并不能对效率有所提升。

    为了提高效率,我们可以尽量使用进程完成无阻塞的并发行为,还可以不使用c作为解释器,改用java或者c#解释器

    关于python的解释器,可以看下面这篇文章了解
    https://blog.csdn.net/orangleliu/article/details/39204897

    ▍结论

    1.GIL问题与python语言本身没什么关系,属于解释器设置历史的问题。

    2.在无阻塞状态下,多线程程序执行效率并不高,甚至还不如单线程。

    3.python多线程只适用于执行有阻塞延迟的任务情形。



    06 进程和线程的联系&区别 



    6.1 联系&区别


    进程和线程的联系&区别
    类别说明
    联系1.两者都是多任务编程,都能使用计算机多核资源
    2.一个进程可以有多个分支线程,两者有包含关系
    3.多个线程共享进程资源,在共享资源操作时往往需要同步互斥处理。
    区别1.进程的创建和删除消耗的计算机资源比线程多
    2.进程空间独立,数据互不干扰,有专门的通信方法;线程使用全局变量通信
    3.python线程存在GIL问题,但进程没有
    mysql也是一个由多进程构成的例子,mysql的InnoDB引擎是单进程里包含多线程的例子。



    ▍下期预告:网络并发模型





    参考资料


    [1] Python线程指南 
    https://www.cnblogs.com/huxi/archive/2010/06/26/1765808.html
    [2] python多线程详解
    https://www.cnblogs.com/luyuze95/p/11289143.html
    [3] _thread --- 底层多线程 API
    https://docs.python.org/zh-cn/3/library/_thread.html
    [4] threading --- 基于线程的并行
    https://docs.python.org/zh-cn/3/library/threading.html


    拓展资料


    [1] python术语对照表
    https://docs.python.org/zh-cn/3/glossary.html
    [2] org域名
    https://baike.so.com/doc/5468111-5706023.html
    [3] 通用顶级域
    https://baike.so.com/doc/748060-791805.html
    [4] [Python]解释器的几种实现版本
    https://blog.csdn.net/orangleliu/article/details/39204897


    花样早餐展

    以上是关于138 python|第八部分:并发网络编程多任务编程上--进程的主要内容,如果未能解决你的问题,请参考以下文章

    137 python|第八部分:并发网络编程网络编程下

    136 python|第八部分:并发网络编程网络编程上

    Python自动化 第八篇:Python基础-Socket编程进阶

    Python学习笔记——进阶篇第八周———Socket编程进阶&多线程多进程

    Akka并发编程——第八节:Actor模型

    第八节:并发编程之Collections&Queue体系分析-杨过