zoukankan      html  css  js  c++  java
  • day 28并发编程

    一、multiprocessing

    multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务。

    multiprocessing模块的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件

    1、Process

    需要使用关键字的方式来指定参数
    args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号,kwargs传的是字典
    创建子进程1
    class MyProcess(Process):
      def __init__(self,name):
        super().__init__()
        self.name=name
      def run(self):
        print('%s is running'%self.name)
        time.sleep(3)
        print('%s is done'%self.name)
    if __name__=='__main__':
      p=MyProcess('lg')
      p.start()
      print('主')
    创建子进程2
    from multiprocessing import Process
    import time
    def take(name):
      print('%name is running'%name)
      time.sleep(3)
      print('%name is done'%name)

    if __name__=='__main__':
      #在windows系统之上,开启子进程的操作一定要放到这下面
      p=Process(target==take,arge=('lg',))
      p.start()#向操作系统发送请求,操作系统会申请内存空间,然后把父进程的数据拷贝给子进程,作为子进程的初始状态
      print('=====主')

    p.start():启动进程,并调用该子进程中的p.run() 
    p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法
    p.name:进程的名称
    p.pid:进程的pid
     
    
    

    进程直接的内存空间是隔离的而且是物理隔离
    from multiprocessing import Process
    import time

    x=1000

    def task():
      time.sleep(1)
      global x
      x=0
      print('aaa',x)
    if __name__=='__main__':
      print(x)
      p=Process(target=task)
      p.start()
      time.sleep(3)
      print(x)
    p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁
    p.is_alive():如果p仍然运行,返回True
    p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程 
    x=1000
    def task(n):
      print('%s is runing'%n)
      time.sleep(n)
    if __name__=='__main__':
      start_time=time.time()
      p1=Process(traget=task,args=(1,),name='任务1')
      p1.start()

      print(p1.pid)
      print(p1,name)
      p1.terminate()
      p1.join()
      print(p1.is_alive())
      print('=========主')


      僵尸与孤儿进程
      孤儿就是主进程干掉了,它产生的子进程没被干掉,系统就会定期回收,无害
      僵尸进程就是子进程干掉了但还留着pid只能等主进程加收如果主进程还没有来得及回收就被干掉后init才会回收,如果主进程一直不死,这样会过多占用pid。
      linux用
    from multiprocessing import Process
    import time,os
    def task(n):
      print('%s is running'%n)
      time.sleep(n)

    if __name__=='__main__':
      p1=Process(tartget=task,args=(1,))
      p2=Process(tartget=task,args=(2,))
      p3=Process(tartget=task,args=(3,))  

      p1.start()
      p2.start()
      p3.start()
      p1.join()
      p2.join()
      p3.join()
      print('====主====',os.getpid())
      time.sleep(10000)
     









  • 相关阅读:
    php数组
    php运算符
    PHP数据类型
    面向对象3和继承
    面向对象2
    面向对象1
    语法整理php
    语法整理
    ajax
    数据库4
  • 原文地址:https://www.cnblogs.com/lg04551/p/8930485.html
Copyright © 2011-2022 走看看