复习网络编程:
#网络编程
#套接字--socket #底层,帮助你完成了两台机器之间的通信,封装了IP协议、端口、tcp协议,底层的arp协议等等。只是提供给你一个接口而已。
arp协议:通过IP找mac地址的过程叫arp协议
#TCP协议特点:可靠的、面向连接的、流传输、消息无边界
#三次握手(建立连接时)和四次挥手(断开连接时)
#UDP协议特点:不可靠、无连接的。数据包传输。UDP协议不会发生粘包现象,容易丢数据。
#粘包现象:在发送数据的时候先发送数据的长度,再接收端先接收数据的长度,再根据数长度接收数据。struct
一、Socketserver
这两个都是python中的内置模块
socket
socketserver--在socket底层模块上封装
#网络编程举例:
server端:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# tcp协议的socket
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',9999))
sk.listen() # 允许最大的等待链接数
conn,addr = sk.accept() # 获取到一个连接
print(conn)
while True:
conn.send(b'hello')
msg = conn.recv(1024)
print(msg)
conn.close()
sk.close()
client端:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',9999))
while True:
print(sk.recv(1024))
sk.send(b'bye')
sk.close()
执行顺序,先启动server端再启动client端,可以看到client端一直输出‘bye’死循环,client端一直输出‘hello’死循环
#socketserver举例:
server端:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import time
import socketserver
class Myserver(socketserver.BaseRequestHandler):
def handle(self):
conn = self.request
print(conn)
time.sleep(3)
conn.send(b'hello')
time.sleep(5)
conn.send(b'hello2')
# socketserver
# socket
myserver = socketserver.ThreadingTCPServer(('127.0.0.1',9000),Myserver)
myserver.serve_forever()
# socketserver所启动的服务端是不能有input操作的
# server端一般都是根据client端的要求去执行固定的代码
# 20函数
client端:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',9000))
print(sk.recv(1024))
print(sk.recv(1024))
sk.close()
执行顺序:先执行server端再执行client端代码:
server端执行结果是:
<socket.socket fd=312, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9000), raddr=('127.0.0.1', 57276)>
client端输出的是:
b'hello'
b'hello2'
二、并发编程
1、# 并发编程?
# 一个程序 可以在同一时刻做多件事情
# 解决程序中的IO操作影响程序效率的问题
# 并发编程为什么重要?
# 操作系统
# 并发这件事
# 计算机 —— 穿孔纸带
# 输入输出 —— 大部分时间都不会占用CPU,且会降低你程序的效率
# input/print
# 文件 读数据、取数据
# 网络操作 : 往网线上 发送请求 写
# 读 从网络上获取数据
# 现代操作系统:
# 基于多道批处理系统和分时系统
# 多个程序、作业在遇到IO操作的时候,操作系统会帮助你进行切换
# 让CPU的利用率得到最大的提高
2、进程
# 进程
# 什么是进程 :运行中的程序
# 什么是程序
# 操作系统 只负责管理调度进程
# 进程是操作系统中资源分配的最小单位
# 每一个运行中的程序都需要有自己的内存、资源
# 都分配给进程 记录执行的状态 管理自己的内存资源
# 在Python中,每一个运行中的程序 都是一个进程
# 一个进程 就能做一件事儿
# 如果有多个进程 —— 就可以做多件事儿
# 如何用python来开启一个进程
举例:
import os import time print(os.getpid()) #进程号 time.sleep(1000)
执行结果:6340
# Process 进程
# multi 多元的
举例:
import os import time from multiprocessing import Process def func(num): print(num,os.getpid()) time.sleep(0.5) print(num, os.getpid()) time.sleep(0.5) print(num, os.getpid()) time.sleep(0.5) print(num,os.getpid()) if __name__ == '__main__': # windows print(os.getpid()) p = Process(target=func,args=(10,)) # 创造了一个进程 p.start() # 开启进程 print(os.getpid()) time.sleep(1) print(os.getpid(),1) time.sleep(1) print(os.getpid(), 2)
执行结果:
6228
6228
10 3212
10 3212
6228 1
10 3212
10 3212
6228 2
# 同步 :
# 异步 :
# 异步可以有效地提高程序的效率
# 几个概念:
# 子进程 :
# 主进程 : 运行的这个程序
# 父进程 :
# 关于print的顺序
# 进程与进程之间都是异步的
# 开启一个进程是有时间开销的
# if __name__ == '__main__':为什么?
3、进程进阶
# 什么是进程 : 运行中的程序,计算机中最小的资源分配单位
# 程序开始执行就会产生一个主进程
# python中可以主进程中用代码启动一个进程 —— 子进程
# 同时主进程也被称为父进程
# 父子进程之间的代码执行是异步的,各自执行自己的
# 父子进程之间的数据不可以共享
# 主进程会等待子进程结束之后再结束
import time from multiprocessing import Process n = 100 def func(): global n n = 0 print('_______') time.sleep(10) # func() if __name__ == '__main__': Process(target=func).start() time.sleep(1) print(n)
执行结果:
_______
100
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import time from multiprocessing import Process def func(n): time.sleep(1) print('_'*n) if __name__ == '__main__': for i in range(10): Process(target=func, args=(i,)).start() # # 发邮件的操作 print('十条信息已经都发送完了') Process(target=func,args=(1,)).start() Process(target=func,args=(2,)).start() Process(target=func,args=(3,)).start() Process(target=func,args=(4,)).start() 执行结果: 十条信息已经都发送完了 _ __ ___ ____ _____ ______ _______ ________ _________ _ __ ___ ____
import time from multiprocessing import Process def func(n): time.sleep(1) print('_'*n) if __name__ == '__main__': # for i in range(10): p = Process(target=func, args=(1,)) p.start() print('子进程开始了') p.join() # 阻塞 直到子进程执行完毕之后再继续 # 发邮件的操作 print('十条信息已经都发送完了') 执行结果: 子进程开始了 _ 十条信息已经都发送完了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import time from multiprocessing import Process def func(n): time.sleep(1) print('_'*n) if __name__ == '__main__': l = [] for i in range(10): p = Process(target=func, args=(i,)) p.start() l.append(p) for p in l:p.join() # 发邮件的操作 print('十条信息已经都发送完了') 执行结果: _ __ ___ ____ _____ ______ _______ ________ _________ 十条信息已经都发送完了
# 守护进程
# 守护进程也是一个子进程
# 当主进程的代码执行完毕之后自动结束的子进程叫做守护进程
import time from multiprocessing import Process import time def deamon_func(): while True: print('我还活着') time.sleep(0.5) def wahaha(): for i in range(10): time.sleep(1) print(i * '#') if __name__ == '__main__' : p2 = Process(target=wahaha) p2.start() p = Process(target=deamon_func) p.daemon = True p.start() for i in range(3): print(i*'*') time.sleep(1) p2.join() 执行结果: 我还活着 我还活着 * 我还活着 我还活着 ** # 我还活着 我还活着 ## 我还活着 我还活着 ### 我还活着 我还活着 #### 我还活着 我还活着 ##### 我还活着 我还活着 ###### 我还活着 我还活着 ####### 我还活着 我还活着 ######## 我还活着 我还活着 #########
总结:
# 开启一个子进程 start
# 子进程和主进程是异步
# 如果在主进程中要等待子进程结束之后再执行某段代码:join
# 如果有多个子进程 不能在start一个进程之后就立刻join,把所有的进程放到列表中,等待所有进程都start之后再逐一join
# 守护进程 —— 当主进程的"代码"执行完毕之后自动结束的子进程叫做守护进程
4、锁
举例1: import os import time import random from multiprocessing import Process,Lock def work(n,lock): lock.acquire() print('%s: %s is running' %(n,os.getpid())) time.sleep(random.random()) print('%s:%s is done' %(n,os.getpid())) lock.release() if __name__ == '__main__': lock = Lock() for i in range(3): p=Process(target=work,args=(i,lock)) p.start() p.join() 执行结果: 0: 5940 is running 0:5940 is done 1: 2808 is running 1:2808 is done 2: 4628 is running 2:4628 is done
# 牺牲效率但是保证了数据的安全 举例2: 前提有个db文件:内容{"count": 1} from multiprocessing import Process,Lock import time,json,random def search(): dic=json.load(open(r'D:老男孩教育老师的笔记和视频day09day9视频与笔记day92-并发编程进程db')) print('