client端python
import json import socket server_addr = ('127.0.0.1',9090) sk = socket.socket(type=socket.SOCK_DGRAM) while True: msg = input('>>>') dic = {'msg': msg, 'username': 'egon'} send_msg = json.dumps(dic).encode('utf-8') sk.sendto(send_msg, server_addr) msg,server_addr = sk.recvfrom(1024) msg_dic = json.loads(msg.decode('utf-8')) print('消息来自%s : %s' % (msg_dic['username'], msg_dic['msg'])) sk.close()
server端算法
import json import socket sk = socket.socket(type= socket.SOCK_DGRAM) sk.bind(('127.0.0.1',9090)) while True: # 不能先发信息 msg,client_addr = sk.recvfrom(1024) # UDP协议接收信息的方法 # {'msg':消息,'username':发送消息的人} msg_dic = json.loads(msg.decode('utf-8')) print('消息来自%s : %s'%(msg_dic['username'],msg_dic['msg'])) msg = input('>>>') dic = {'msg':msg,'username':'server'} send_msg = json.dumps(dic).encode('utf-8') sk.sendto(send_msg,client_addr) sk.close() # UDP协议 # 无链接,能够多个客户端发送 # 快 # 不可靠 # 面向数据包的传输 只能发短消息
server端编程
import socketserver class Myserver(socketserver.BaseRequestHandler): def handle(self): conn = self.request addr = self.client_address while True: conn.send(b'hello') print(conn.recv(1024),addr[1]) if __name__ == '__main__': server = socketserver.ThreadingTCPServer(('127.0.0.1',9090),Myserver) server.serve_forever()
client端没有变化json
import socket sk = socket.socket() sk.connect(('127.0.0.1',9090)) while True: print(sk.recv(1024)) sk.send(b'bye') sk.close()
多道操做系统: 数据隔离 资源分配安全
在一台机器读数据进CPU的时候 这台机器还能同时计算另一个程序 CPU在两个程序之间切换?? 碰见不须要CPU工做的代码的时候 IO操做 输入输出 time.sleep() input f.read sk.accept sk.recv print f.write sk.send 提升了CPU的工做效率
分时系统 反而下降了效率,可是提升了用户体验网络
A 3min 6min B 24h 24h3min 短做业优先算法 CPU工做的时间 分红很小很小的时间片 全部的做业在操做系统的调度下轮流被CPU执行 纯浪费效率
CPU个数提升session
多个程序在运行 运行中的程序 - 进程 # 进程 # 进程是计算机中资源分配的最小单位 # PID process id 进程的id # ppid parent porcess id 父进程
并行 : 并行是指二者同时执行,好比赛跑,两我的都在不停的往前 跑;(资源够用,好比三个线程,四核的CPU ) 并发 : 并发是指资源有限的状况下,二者交替轮流使用资源,好比一 段路(单核CPU资源)同时只能过一我的,A走一段后,让给B,B用完继 续给A ,交替使用,目的是提升效率。 区别: 并行是从微观上,也就是在一个精确的时间片刻,有不一样的程序在执 行,这就要求必须有多个处理器。 并发是从宏观上,在一个时间段上能够看出是同时执行的,好比一个服 务器同时处理多个session。
同步 作完一件事情 再作另一件事情 异步 作一件事情的时候 能够再作另外一件事情 通常说一个程序是异步程序,表示这个程序能够多线程并发。 阻塞 recv sleep accept input recv recvfrom 非阻塞 没有碰见上面这些阻塞的状况就是非阻塞 阻塞和非阻塞这两个概念与程序(线程)等待消息通知(无所谓同步或 者异步)时的状态有关。也就是说阻塞与非阻塞主要是程序(线程)等 待消息通知时的状态角度来讲的
仔细说来,multiprocess不是一个模块而是python中一个操做、管理进程的包。 之因此叫multi是取自multiple的多功能的意思,在这个包中几乎包含了和进程有关的全部子模块。因为提供的子模块很是多,为了方便你们归类记忆,我将这部分大体分为四个部分:建立进程部分,进程同步部分,进程池部分,进程之间数据共享。多线程
process模块是一个建立进程的模块,借助这个模块,就能够完成进程的建立。并发
import time from multiprocessing import Process def f(name): print('hello', name) print('我是子进程') if __name__ == '__main__': # if __name__ == '__main__': 在win上必须写,在其余操做系统上可不写 p = Process(target=f, args=('bob',)) p.start() time.sleep(1) print('执行主进程的内容了') # 主进程和子进程的异步 并发效果、 # 主进程会等待子进程结束以后在结束, 为何主进程要等待子进程结束 主进程要回收子进程的资源
进阶,多个进程同时运行(注意,子进程的执行顺序不是根据启动顺序决定的)app
import time from multiprocessing import Process def f(name): print('hello', name) time.sleep(1) if __name__ == '__main__': p_lst = [] for i in range(5): p = Process(target=f, args=('bob',)) p.start() p_lst.append(p) # [p.join() for p in p_lst] print('父进程在执行') 主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)
除了上面这些开启进程的方法,还有一种以继承Process类的形式开启进程的方式
import os
from multiprocessing import Process
class MyProcess(Process): def __init__(self,name): super().__init__() self.name=name def run(self): print(os.getpid()) print('%s 正在和女主播聊天' %self.name) p1=MyProcess('wupeiqi') p2=MyProcess('yuanhao') p3=MyProcess('nezha') p1.start() #start会自动调用run p2.start() # p2.run() p3.start() p1.join() p2.join() p3.join() print('主线程')
import os import time from multiprocessing import Process def func2(): print('func2 before', os.getpid()) time.sleep(5) print('func2 after',os.getpid()) def func(): print('in func before', os.getpid()) time.sleep(3) print('in func after',os.getpid()) if __name__ == '__main__': p = Process(target=func) p.daemon = True # 将p设置为一个守护进程 p.start() p = Process(target=func2) p.start() time.sleep(1) print('主进程',os.getpid()) # 主进程的代码执行完毕以后 守护进程就自动结束了 - 守护进程
一、 先把QQ这个背写出来(多进程的普通实现)
二、 多进程的类方法实现
三、 socketserver
四、join
from multiprocessing import Process def f(name): print('hello', name) if __name__ == '__main__': p_lst = [] for i in range(5): p = Process(target=f, args=('bob',)) p.start() p_lst.append(p) [p.join() for p in p_lst] print('父进程在执行')
类的join
from multiprocessing import Process class MyProcess(Process): def __init__(self,name): super().__init__() self.name = name def run(self): print(self.name) if __name__ == '__main__': p = MyProcess('houbinglei') p.start() p.join() print('主程序')
五、daemon
import time from multiprocessing import Process def f(name): print('hello', name) time.sleep(2) if __name__ == '__main__': p_lst = [] for i in range(5): p = Process(target=f, args=('bob',)) p.daemon = True p.start() p_lst.append(p) # [p.join() for p in p_lst] print('父进程在执行')
六、锁
import json import time from multiprocessing import Process,Lock def search(i): with open('ticket_db.py') as f: ticket = json.load(f) time.sleep(0.1) print('%s查询余票 : '%i,ticket['count']) def buy_ticket(i,lock): lock.acquire() with open('ticket_db.py') as f: ticket = json.load(f) time.sleep(0.1) if ticket['count'] > 0: ticket['count'] -= 1 print('%s购票成功'%i) else: print('购票失败') time.sleep(0.1) with open('ticket_db.py','w') as f: json.dump(ticket,f) lock.release() def get(i,lock): search(i) buy_ticket(i,lock) if __name__ == '__main__': lock = Lock() for i in range(20): p = Process(target=get,args=(i,lock)) p.start()
七、 队列
from multiprocessing import Queue,Process # IPC Inter-process communication def func(q): print(q.get()) if __name__ == '__main__': q = Queue() p = Process(target=func,args=(q,)) p.start() q.put(12345) # 队列 # 帮助你保证进程之间的数据安全