网络编程——进程,多进程

一.进程的两种创建方法:
第一种:继承的方式,继承Process类
class MyProcess(Process):
  def __init__(self,n,name):
    super().__init__()
    self.n = n
    self.name = name
  def run(self):

  #在采用继承方式的时候,run函数必须要定义,因为Process中.start()之后就会自动执行run()  PS:一般都是在run方法下写执行自定义的代码块
    # print(1+1)
    # print(123)
    print('子进程的进程ID',os.getpid())
    print('你看看n>>',self.n)
if __name__ == '__main__':
  p1 = MyProcess(100,name='子进程1')
  p1.start() #给操作系统发送创建进程的指令,子进程创建好之后,要被执行,执行的时候就会执行run方法
  print('p1.name',p1.name)
  print('p1.pid',p1.pid)
  print('主进程结束')
p1 = MyProcess(参数,name='名字') name是子进程的名字,可以自己命名
p1.pid() 打印出来的就是p1该子进程的pid值

 

第二种:普通的方法
import time
from multiprocessing import Process
import os

def func1(n):
  time.sleep(1)
  print(n)
def func2(n):
  time.sleep(1)
  print(n)
def func3(n):
  time.sleep(1)
  print(n)
def func4(n):
  time.sleep(1)

  print(n)

if __name__ == '__main__':
  p1 = Process(target=func1,args=(1,))
  p2 = Process(target=func2,args=(2,))
  p3= Process(target=func3,args=(3,))
  p4 = Process(target=func4,args=(4,))
  p1.start() 开始一个子进程,底层调用的是p.run()
  p2.start()
  p3.start()
  p4.start()
time.sleep(0.5)
print('主进程结束')

 

二.进程传参的两种参数

第一种:args

from multiprocessing import Process
def func (n):
    print(n)
if__name__ == '__main__':
    p = Process(target=func,args=(1,)) args传的是元组形式
    p.start()

第二种:kwargs

from multiprocessing import Process
def func (name):
    print(name)
if__name__ == '__main__':
    p = Process(target=func,kwargs={'name':' 吕三儿 '}) 关键字参数,key必须和func函数里的参数名字一样,否则报错
    p.start()
    print(' 主进程结束 ')

三.进程之间资源不共享(空间隔离的)

from multiprocessing import Process
global_num = 100
def func ():
    global global_num
    global_num = 0
    print(' 子进程 ', global_num)
if __name__ == '__main__':
    p = Process(target=func)
    p.start()
    time.sleep(1)
    print(' 主进程 ', global_num)

 

四.进程中异步变同步

from multiprocessing import Process
import time
def func ():
    time.sleep(2)
    print(" 子进程执行结束 ")
if __name__ == '__main__':
    p = Process(target=func)
    p.start()
    p.join() # 阻塞住 , 等待子进程 p 执行结束之后 , 主进程才能继续往下走
    print(' 主进程执行结束 ')

五.for循环在创建进程中的应用

第一种

from multiprocessing import Process
import time
def func (n):
    time.sleep(1)
    print(n)
if __name__ == '__main__':
    start = time.time()
    for i in range(10):
        p = Process(target=func, args=(i,))
        p.start()
        p.join()
print(' 主进程结束 ')
print(time.time()-start)
            

第二种

from multiprocessing import Process 
import time
def func (n):
    # time.sleep(1)
    print(n)
if __name__ == '__main__':
    start = time.time()
    pro_list = []
    for i in range(10):
        p = Process(target=func, args=(i,))
        p.start()
        pro_list.append(p)
    for p in pro_list:
        p.join()
print(' 主进程结束 ')
print(time.time()-start)
                

六.验证并发的执行时间

from multiprocessing import Process
import time
def func1 (n):
    time.sleep(n)
    print('func1', n)
def func2 (n):
    time.sleep(n)
    print('func2', n)
def func3 (n):
    start = time.time()
    time.sleep(n)
    print('func3', n)
    print(time.time() - start)
if __name__ == '__main__':
    p1 = Process(target=func1, args=(1,))
    p2 = Process(target=func2, args=(2,))
    p3 = Process(target=func3, args=(3,))
    p1.start()
    p2.start()
    p3.start()
print(' 主进程结束 ')

七.进程中的其他方法

from multiprocessing import Process
import time
def func ():
    print(" 子进程 ")
if __name__ == '__main__':
    p = Process(target=func)
    p.start()
    p.terminate() # 给操作系统发了一个关闭 p1 子进程的信号 , 关闭进程
    time.sleep(1)
    print(p.is_alive()) # 判断子进程是否还活着
    print(' 主进程 ')

八.僵尸进程和孤儿进程

僵尸进程:子进程执行结束之后,操作系统把资源回收了,但是僵尸进程还是会遗留一些东西

from multiprocessing import Process
import time, os
def func ():
    time.sleep(2)
    print(os.getpid())
    print(' 僵尸进程 ')
if __name__ == '__main__':
    p = Process(target=func)
    p.start()
    p.join() # 子进程执行结束 , 操作系统将资源回收 , 但是子进程还是遗留了一些东西 , 叫做僵尸进程
    print(p.pid) # 让可以打印出来子进程的 id
    print(' 主进程结束 ')

孤儿进程:主进程结束了,但是子进程还在运行着(在主进程执行完毕之后,在任务管理器中将主进程结束,但
是子进程仍在继续执行,这时子进程就是孤儿进程)

from multiprocessing import Process
import time, os
def func ():
    time.sleep(30)
    print(' 孤儿进程 ', os.getpid())
if __name__ == '__main__':
    p = Process(target=func)
    p.start()
    print(p.pid)
    print(' 主进程 ', os.getpid())

九.守护进程

守护进程:守护进程跟随着父进程的代码执行结束而结束,守护进程不可以再创建子进程

from multiprocessing import Process
import time
def func ():
    print(' 子进程 ')
if __name__ == '__main__':
    p = Process(target=func)
    p.daemon = True 必须设置在p.start()之前
    p.start()
    time.sleep(1)
    print(' 主进程执行结束 ')

 

posted @ 2018-08-21 15:30  Morallz  阅读(151)  评论(0编辑  收藏  举报