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
p.ppid:父进程的pid
父进程的pid 是pycharm的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只能等主进程被干掉后才会回收,如果主进程一直不死,这样会过多占用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)
 









猜你喜欢

转载自www.cnblogs.com/lg04551/p/8930485.html