本周是培训的第四周,也是python语言基础阶段的最后一周,重点在于多进程、多线程及网络编程的掌握,主要知识概要如下所示:
1、多重继承
-
概念:如果一个类有多个父类,而多个父类又有公共的父类(菱形继承,钻石继承),即为多重继承
-
在搜索属性和方法时搜索的依据是C3算法(有点类似于广度优先搜索)。这是python3中的一个改进,在此之前(python2)搜索的算法是深度优先搜索(DFS,depth first search)
-
建议:不要轻易使用多重继承,会使系统出现混乱。在多重继承中,将第一个之后的类设置为抽象类,只绑定方法(行为),不绑定属性
2、正则表达式 (工具 - 定义字符串的匹配模式)
-
参考资料:《正则表达式30分钟入门教程》
例:
import re
name = input("请输入用户名:")
m = re.match(r"^\w{6,20}$", name) # ^:字符串的开始 $:字符串的结束 match:从头开始匹配 search:从任意位置开始匹配
if m:
print(m.span()) # 取到匹配的范围
print(m.group()) # 取到匹配的内容 -
替换(re.sub() 替换指定字符串)
sentence = "fuckshitFuckshit"re.IGNORECASE:忽略大小写
sub_sentence = re.sub(r"fuck|shit","*",sentence,flags=re.IGNORECASE)
print(sub_sentence)
3、多进程、多线程
-
进程:操作系统分配内存的基本单位,进程之间的内存是相互隔离的,相互通信要通过IPC机制(管道,套接字)
-
线程:一个进程可以进一步划分为多个线程,线程是进程的执行单元,也是操作系统分配cpu的基本单元,线程越多,占用的cpu时间越多。线程可以共享数据,而进程的内存不可共享
-
使用多进程、多线程的原因:
1)为了得到更多的cpu调度,遇到耗时间的任务,可把任务分解成更多子任务去执行,(缩短程序的执行时间,提升性能)
2)让用户获得更好的体验 -
创建多进程
multiprocessing - 多进程 创建新进程
from multiprocessing import Process
创建一个子进程
Process(target=output).start()
-
创建多线程
1)直接创建Thread对象并通过target参数指定线程启动后要执行的任务
2)通过继承Thread自定义线程,通过重写run方法指定线程启动后执行的任务
例:
(直接创建)
from threading import Threaddaemon = True:守护线程(不值得保留的线程)
其他线程如果都执行完毕了那么守护线程自动结束
t = Thread(target=output, args=("ping",),daemon=True)
(通过类创建)
class PrintThread(Thread):
def init(self, string, count):
super().init()
self._string = string
self._count = countdef run(self): for _ in range(self._count): print(self._string, end="", flush=True)
t = PrintThread("PONG",100)
t.start() -
加锁
from threading import Lock
lock = Lock()当多个线程同时访问一个资源的时候就有可能因为竞争资源导致资源状态错误
被多个线程访问的资源我们通常称之为临界资源,对临界资源的访问需要加上保护
lock.acquire() # 加锁,不必需别加锁
lock.release() # 不管操作如何,总要释放锁,否则会死锁
4、TCP/UDP
TCP - Transfer Control Protocol --- 保证传输无错
UDP - User Datagram Protocol --- 不保证传输无错
本周没有过多的课程作业,课余练习期间自主运用多线程知识将贪吃蛇游戏的界面处理与外界事件处理分开,消除了卡顿对游戏效果的影响;利用TCP创建简易对话应用,并运用多线程分别控制收、发消息过程,使得收发消息不受顺序的影响,畅通自如;利用UDP进行指定图片的传输;运用多线程改写之前通过JSON下载网络API提供的图片信息,速度较之前的单线程有了明显的提高。此外,通过一定的练习对正则表达式在实际开发中的应用有了一定的把握。
周五进行了阶段性测试,自我感觉稳了。现在开始渐渐意识到编程的难点不在于代码的书写,而在于思维是否清晰。只要能具体地将任务的流程、需求、关键点等信息清晰地描述出来,再用代码实现并非难事。如果做不到,便会出现卡壳,出错的概率也会大大增加。期待下一周的前端知识~
网友评论