多进程基础, 主要是用了 multiprocessing模块 :
在一个python进程中开启子进程,start方法和并发效果。
import time from multiprocessing import Process def f(name): print('hello', name) print('我是子进程') if __name__ == '__main__': p = Process(target=f, args=('bob',)) p.start() time.sleep(1) print('执行主进程的内容了')
多进程与PID
# 多个进程可以同时执行 并发 # 我们现在写的一个py文件就自己一个进程 同步执行代码 # 并发效果: # 在我们自己的一个py文件里 启动多个进程 # 多个进程之间 - 操作系统 # 如何在自己的py文件里 启动一个进程 import os import time from multiprocessing import Process def func(args): print(args) time.sleep(1) print('子进程', os.getpid()) print('子的父进程', os.getppid()) print('hahaha') if __name__ == '__main__': # windows下必须加这句 print('父进程',os.getpid()) p = Process(target=func,args=(555,)) # 注册 p 是一个进程对象 参数必须是元组 p.start() # 启动一个子进程 print('父父进程',os.getppid()) # 查看当前主进程的父过程 (当前pycharm的PID)
老师的:http://www.cnblogs.com/Eva-J/articles/8253549.html#_label2
join 感知进程结束
import time from multiprocessing import Process def func(arg1,arg2): print('*'*arg1) time.sleep(3) print('*'*arg2) if __name__ == '__main__': # windows下必须加这句 p = Process(target=func,args=(10,20)) p.start() print('hhhhhhhh') p.join() # 感知一个子进程的结束,将异步变为同步 print('=========== 运行结束.')
多个子进程写入文件:
import time import os from multiprocessing import Process # def func(arg1,arg2): # print(arg1) # time.sleep(2) # print('*'*arg2) # # # if __name__ == '__main__': # p_list = [] # for i in range(10): # p = Process(target=func,args=(10*i,6*i)) # p_list.append(p) # p.start() # # p.join() # [p.join() for p in p_list] # print('over.') def func(filename,content): with open(filename,'w') as f: f.write(str(content)) if __name__ == '__main__': # windows下必须加这句 p_list = [] for i in range(1,6): # 开5个子进程 p = Process(target=func,args=('info%s' %i,i)) p_list.append(p) p.start() [p.join() for p in p_list] # 最终每个进程写入一个文件 print(i for i in os.walk(r'F:python_s9练习py3s9day36 process'))
OOP方式 multiprocessing
import time import os from multiprocessing import Process # 自定义类,必须继承 Process class MyProcess(Process): def run(self): # 必须实现run方法,它是子进程中执行的代码 print(self.pid) print(self.name) print(os.getpid()) if __name__ == '__main__': # windows下必须加这句 print('master:',os.getpid()) p1 = MyProcess() p1.start() p2 = MyProcess() p2.start()
# 进程与进程之间 数据是完全隔离的。 import os from multiprocessing import Process def func(): global n n =0 print('pid: %s %s' % (os.getpid(), n)) if __name__ == '__main__': n =100 p = Process(target=func) p.start() p.join() print(os.getpid(),n)
守护进程:
# 子进程 -- > 守护进程 import time from multiprocessing import Process def func(): while True: time.sleep(0.2) print('我还活着') def func2(): print('in func2 start') time.sleep(3) print('in func2 finished') if __name__ == '__main__': p = Process(target=func) p.daemon = True # 设置子进程为守护进程 p.start() # i = 0 # while i<5: # print('我是socket server') # time.sleep(1) # i+=1 p2 = Process(target=func2) p2.start() p2.terminate() # 结束一个子进程 time.sleep(1) print(p2.is_alive()) # 检验一个进程是否还活着 print(p2.name) # 守护进程 会 随着 主进程的代码执行完毕 而 结束 # 在主进程内结束一个子进程 p.terminate() # 结束一个进程不是在执行方法之后立即生效,需要一个操作系统响应的过程 # 检验一个进程是否活着的状态 p.is_alive() # p.name p.pid 这个进程的名字和进程号
进程锁: lock.acquire()
# 进程锁 只在多进程时使用 # 火车票 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('