线程锁
- 功能
解决多个线程同时使用全局变量,有可能会造成的数据的混乱 - 如何创建锁
锁对象 = threading.Lock()
lock
英 [lɒk] 美 [lɑːk]
v.
(用锁)锁上;被锁住;把…锁起来;(使)固定,卡住,塞住
n.
锁;车锁;制动器;锁定器;制轮楔;(机器部件等的)锁定
- 如何使用锁
- 上锁
锁对象.acquire()
acquire
英 [əˈkwaɪə(r)] 美 [əˈkwaɪər]
v.
(通过努力、能力、行为表现)获得;购得;获得;得到
- 解锁
锁对象.release()
release
英 [rɪˈliːs] 美 [rɪˈliːs]
v.
释放;放出;放走;放开;松开;使自由移动(或飞翔、降落等);发泄;宣泄
n.
释放;获释;公开;发行;发布;新发行的东西;(尤指)新激光唱片,新电影
进程锁
- 创建锁
进程锁对象 = multiprocessing.Lock()
- 使用锁
- 上锁
进程锁对象.acquire()
- 解锁
进程锁对象.release()
守护进程
进程对象.daemon = True
daemon
英 [ˈdiːmən] 美 [ˈdiːmən]
n.
(古希腊神话中的)半神半人精灵
信号量
- 创建对象
信号量对象 = multiprocessing.Semaphore(钥匙的数量)
Semaphore
英 [ˈseməfɔː(r)] 美 [ˈseməfɔːr]
信號量;旌旗灯号量;信号量;信号灯;信号
- 使用
- 获得-从面版上拿
信号量对象.acquire()
- 释放-归还到面版上
信号量对象.release()
- 同步与异步
- 阻塞与非阻塞
- 并行与并发
range迭代器
创建range的对象
range(数值)
range(起点值,终点值)
range(起点值,终点值,步长)
它的效果相当于给我们快速的生成了一个列表
但是,它比列表省空间,效率高
列表生成式
- 特点
节省空间,比直接的列表要省空间 - 写法
生成的列表 = [变量 for 变量 in 容器]
- 案例
一行代码打印九九乘法表
print(([(['%s*%s=%-2s' % (y, x, x*y) for y in range(1, x+1)]) for x in range(1, 10)]))
复习如何解决粘包问题
- 描述
连续send小数据时,他们会粘在一起发送
收消息时如果长度与实发不符合,下一次收消息时会发生顺序的错乱 - 解决
- 通过阻塞方式,例如input或tcp的recv等
- 通过延迟方式,例如time.sleep(0.001)
- 改变客户端与服务端的
- 工具模块
- struct模块
- struct.pack(‘i’, 整数) ----》 四个字节的bytes数据
- struct.unpack(‘i’, 打包的bytes数据) ---------》长度元组。 通过0号索引可取得值