网络编程进阶
进程:
import os from multiprocessing import Process def func(): print('子进程%s, 父进程%s' %(os.getpid(),os.getppid())) if __name__ == '__main__': p = Process(target=func) # 子进程3616, 父进程5916 p.start()
# 带参数用法 import os from multiprocessing import Process def func(i): print('主进程%s,子进程[%s]%s' %(os.getppid(),i,os.getpid())) if __name__ == '__main__': for i in range(5): p = Process(target = func, args=(i,)) p.start() print('执行结束...')
# 同步 join的用法 import os from multiprocessing import Process def func(i): print('主进程%s,子进程[%s]%s' %(os.getppid(),i,os.getpid())) if __name__ == '__main__': l = [] for i in range(5): p = Process(target = func, args=(i,)) p.start() l.append(p) for i in l: i.join() print('执行结束...')
# 自定义类创建进程 ## 必须继承Process这个父类 ## 所有进程执行任务的逻辑写在run方法里面,必须定义run方法 ## 如果要带参数,要重写父类的init方法 from multiprocessing import Process import os class MyProcess(Process): def __init__(self,args): super().__init__() self.args = args def run(self): print('主进程%s,子进程%s,参数是%s' %(os.getppid(),os.getpid(),self.args)) if __name__ == '__main__': l = [] for i in range(5): p = MyProcess(i) p.start() l.append(p) for i in l: i.join() print('执行结束...')
# 守护进程 ## 进程.daemon = True 设置当前进程为守护进程,主程序执行结束后带走守护进程,不管守护进程是否执行结束 ## 设置守护进程要在 进程.start()之前设置。 import os from multiprocessing import Process def func1(args): print('func1',args) def func2(args): print('func2',args) if __name__ == '__main__': for i in range(5): p1 = Process(target=func1,args=(i,)) p2 = Process(target=func2,args=(i,)) p1.daemon = True p1.start() p2.start() print('执行结束...') -------------------------------- 不开守护的执行结果: 执行结束... func2 1 func1 1 func1 2 func2 3 func1 0 func1 4 func2 0 func1 3 func2 2 func2 4 ---------------------------------------- 打开守护的执行结果: 执行结束... func2 0 func2 4 func2 1 func2 2 func2 3 ---------------------
# 守护进程之监控报活 ## 确保服务器运行正常,服务器上会开辟一个进程,用于向监控服务器每个几个小时就发一次信息。如果监控服务器很长时间没有收到来自服务器的消息,那就需要维修了 import time from multiprocessing import Process def alive(): """这个进程是报活进程""" while True: print('给监控服务器发消息,当前5号服务器工作正常...') time.sleep(5) # 现实中设置为4小时或者其他,秒在这里是为了方便 def func(): """这个进程是服务器的工作内容,这个就一直运行""" while True: time.sleep(24*60*60) # 现实场景就是服务器在统计财务报表,24小时不停工作 print('我是5号服务器,我负责统计财务报表...') # 服务器在统计报表,但是会开一个新的进程用于监控报活 if __name__ == '__main__': p1 = Process(target=alive) p2 = Process(target=func) p1.daemon = True # 报活进程作为守护进程,服务器挂了,就不会像监控服务去发消息了 p1.start() p2.start() p2.join() # 服务器本身功能设置成为主进程的同步进程
import json from multiprocessing import Process,Lock def ticket_info(sign, dic=None): """读写配置文件的函数,用于更改票数""" if sign == 'r': dic = json.load(open('ticket')) return dic elif sign == 'w': json.dump(dic, open('ticket','w')) def get_ticket(person,lock): """查票""" dic = ticket_info('r') count = dic['count'] print('%s查询到现存票数%s' %(person, count)) if count > 0: lock.acquire() print(person, '抢到了...') dic['count'] -= 1 ticket_info('w', dic) lock.release() else: print(person, '没票了...') if __name__ == '__main__': lock = Lock() l = [] for person in range(50): p = Process(target=get_ticket,args=(person,lock)) p.start() # l.append(p) # for i in l: # i.join() # print('结束了...') ---------------------------------- ticket 文件存储的字典 {“count”:1} ----------------------------------- # 数据共享 # Lock import configparser from multiprocessing import Process,Lock def ticket_info(sign,count=None): """读写配置文件的函数,用于更改票数""" if sign == 'r': cf = configparser.ConfigParser() cf.read('ticket') count = cf.getint('ticket', 'count') return count elif sign == 'w': cf = configparser.ConfigParser() cf['ticket'] = {'count': count} cf.write(open('ticket', 'w')) def get_ticket(person,lock): """查票""" count = ticket_info('r') print('%s查询到现存票数%s' %(person, count)) if count > 0: lock.acquire() print(person, '抢到了...') count -= 1 ticket_info('w', count) lock.release() else: print(person, '没票了...') if __name__ == '__main__': lock = Lock() l = [] for person in range(50): p = Process(target = get_ticket,args=(person,lock)) p.start() l.append(p) for i in l: i.join() print('结束了...') ---------------------------------- ticket 文件存储的 [ticket] count = 1 -----------------------------------
# Semaphore 信号量 可以控制锁的数量 ''' from multiprocessing import Process, Semaphore import time # sem = Semaphore(4) # 获取对象,4把锁 # sem.acquire() # sem.release() def ktv(person,sem): sem.acquire() print('%s在唱歌' %person) time.sleep(2) sem.release() if __name__ == '__main__': sem = Semaphore(4) for i in range(20): p = Process(target=ktv,args=(i,sem)) p.start()
# Event 事件 # 基本语法 from multiprocessing import Process,Event e = Event() print(e.is_set()) # 默认False e.wait(2) # 阻塞2秒 print('程序进行中...') # 阻塞2秒后代码执行 --------------------------------------------------- # 模拟红绿灯 def traffic_light(e): print('红灯亮') while True: if e.is_set(): # 绿灯状态,亮1秒钟 time.sleep(1) print('红灯亮') # 把True ==> False e.clear() else: # 红灯状态,亮一秒钟 time.sleep(1) print('绿灯亮') # 把False ==> True e.set() def car(e,i): if e.is_set(): # 绿灯状态,车放行 print('car %s is running' % i) else: # 红灯状态,阻塞 print('car %s is waiting' %i) if __name__ == '__main__': e = Event() p1 = Process(target=traffic_light, args=(e,)) p1.start() for i in range(10): p2 = Process(target=car,args=(e,i)) p2.start() time.sleep(random.uniform(0,1))
from multiprocessing import Queue, Process # 基本用法 q = Queue() q.put(111) q.put(222) res = q.get() print(res) # 111 res = q.get() print(res) # 222 res = q.get() # 阻塞 --------------------------------------- # 进程之间通过队列交换数据 def func(q): # 子进程取数据 res = q.get() print(res) if __name__ == '__main__': q = Queue() p = Process(target=func,args=(q,)) p.start() q.put(11) ------------------------------------------ # 生产者消费者模型 通过ut一个None 来结束 from multiprocessing import Process, Queue import time def consumer(q,name): while True: food = q.get() if food == None: break print('%s吃了%s' %(name,food)) def producer(q,name,food): for i in range(5): print('%s生产了%s个%s' %(name,i,food)) q.put(food+str(i)) q.put(None) if __name__ == '__main__': q = Queue() p1 = Process(target=consumer, args=(q,'ali')) p1.start() p2 = Process(target=producer, args=(q,'sue','包子')) p2.start() ------------------------------------------------ # 生产者消费者模型 改良版 from multiprocessing import Process, JoinableQueue import time def consumer(q,name): while True: food = q.get() print('%s吃了%s' %(name,food)) q.task_done() def producer(q,name,food): for i in range(5): print('%s生产了%s个%s' %(name,i,food)) q.put(food+str(i)) if __name__ == '__main__': q = JoinableQueue() p1 = Process(target=consumer, args=(q,'ali')) p1.daemon = True p1.start() p2 = Process(target=producer, args=(q,'sue','包子')) p2.start() p2.join() q.join()
# Manager 共享列表,字典数据 from multiprocessing import Manager, Process, Lock def work(data,lock): lock.acquire() data['count'] -= 1 lock.release() if __name__ == '__main__': m = Manager() data = m.dict({'count':1000}) l = [] lock = Lock() for i in range(100): p = Process(target=work,args=(data,lock)) p.start() l.append(p) for i in l: i.join() print(data)