好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

python基础一 day 36j多进程

1.多进程:

import os import time from multiprocessing import Process def func(args,args2): print(args,args2) time.sleep(3) print(‘子进程 :‘, os.getpid()) print(‘子进程的父进程 :‘, os.getppid()) print(12345)

if __name__ == ‘__main__‘: p = Process(target=func,args=(‘参数‘,‘参数2‘)) # 注册 # p是一个进程对象,还没有启动进程 p.start() # 开启了一个子进程 print(‘*‘*10) print(‘父进程 :‘,os.getpid()) # 查看当前进程的进程号 print(‘父进程的父进程 :‘,os.getppid()) # 查看当前进程的父进程

# 进程的生命周期 # 主进程 # 子进程 # 开启了子进程的主进程 : # 主进程自己的代码如果长,等待自己的代码执行结束, # 子进程的执行时间长,主进程会在主进程代码执行完毕之后等待子进程执行完毕之后 主进程才结束

2.多进程中的几个方法

# join() import time from multiprocessing import Process

def func(arg1,arg2): print(‘*‘*arg1) time.sleep(5) print(‘*‘*arg2)

if __name__ == ‘__main__‘: p = Process(target=func,args=(10,20)) p.start() print(‘hahahaha‘) p.join() # 是感知一个子进程的结束,将异步的程序改为同步 print(‘====== : 运行完了‘)

3.开启多个子进程

import os import time from multiprocessing import Process

def func(filename,content): with open(filename,‘w‘) as f: f.write(content*10*‘*‘)

if __name__ == ‘__main__‘: p_lst = [] for i in range(10): p = Process(target=func,args=(‘info%s‘%i,0)) p_lst.append(p) p.start() for p in p_lst:p.join() # 之前的所有进程必须在这里都执行完才能执行下面的代码 print([i for i in os.walk(r‘E:\python10\day37‘)])

# 同步 0.1 * 500 = 50 # 异步 500 0.1 = 0.1 # 多进程写文件 # 首先往文件夹中写文件 # 向用户展示写入文件之后文件夹中所有的文件名

4.开启多进程的第二种方式

import os from multiprocessing import Process

class MyProcess(Process): def __init__(self,arg1,arg2): super().__init__() self.arg1 = arg1 self.arg2 = arg2

def run(self): print(self.pid) print(self.name) print(self.arg1) print(self.arg2)

if __name__ == ‘__main__‘: p1 = MyProcess(1,2) p1.start() p2 = MyProcess(3,4) p2.start()

# 自定义类 继承Process类 # 必须实现一个run方法,run方法中是在子进程中执行的代码

5.多进程之间的数据隔离问题

# 进程 与 进程之间 import os from multiprocessing import Process

def func(): global n # 声明了一个全局变量 n = 0 # 重新定义了一个n print(‘pid : %s‘%os.getpid(),n)

if __name__ == ‘__main__‘: n = 100 p = Process(target=func) p.start() p.join() print(os.getpid(),n)

6.守护进程

# 子进程 -- > 守护进程 import time from multiprocessing import Process

def func(): while True: time.sleep(0.2) print(‘我还活着‘)

def func2(): print(‘in func2 start‘) time.sleep(8) print(‘in func2 finished‘)

if __name__ == ‘__main__‘: p = Process(target=func) p.daemon = True # 设置子进程为守护进程 p.start() p2 = Process(target=func2) p2.start() p2.terminate() # 结束一个子进程 time.sleep(1) print(p2.is_alive()) # 检验一个进程是否还活着 print(p2.name) # i = 0 # while i<5: # print(‘我是socket server‘) # time.sleep(1) # i+=1

# 守护进程 会 随着 主进程的代码执行完毕 而 结束 # 在主进程内结束一个子进程 p.terminate() # 结束一个进程不是在执行方法之后立即生效,需要一个操作系统响应的过程 # 检验一个进程是否活着的状态 p.is_alive() # p.name p.pid 这个进程的名字和进程号

7.锁

# 锁

# 火车票 import json import time from multiprocessing import Process from multiprocessing import Lock

# def show(i): # with open(‘ticket‘) as f: # dic = json.load(f) # print(‘余票: %s‘%dic[‘ticket‘])

def buy_ticket(i,lock): lock.acquire() #拿钥匙进门 with open(‘ticket‘) as f: dic = json.load(f) time.sleep(0.1) if dic[‘ticket‘] > 0 : dic[‘ticket‘] -= 1 print(‘\033[32m%s买到票了\033[0m‘%i) else: print(‘\033[31m%s没买到票\033[0m‘%i) time.sleep(0.1) with open(‘ticket‘,‘w‘) as f: json.dump(dic,f) lock.release() # 还钥匙

if __name__ == ‘__main__‘: # for i in range(10): # p = Process(target=show,args=(i,)) # p.start() lock = Lock() for i in range(10): p = Process(target=buy_ticket, args=(i,lock)) p.start()

查看更多关于python基础一 day 36j多进程的详细内容...

  阅读:19次