当你的朋友需要科学上网的时候

自建还是机场 遥想大一暑假,一个零基础小白捣鼓 Shadowsocks 花了整整三天: 找免费 VPN 注册搬瓦工 搜索 Linux 的各种命令行用法 配置编译环境一大堆报错 从 Ubuntu12.04 到 CentOS7 再到 CentOS6 重复 2-3 直到跑起 ss-server Chrome 搭配 SwitchyOmega 打开谷歌的一瞬间有莫大的成就感 在油管看完 Maroon5 - Payphone 的 MV 后开始思考翻墙有什么用 也曾陷入过追求工具的狂热 | 可用性 | 速度 | 开销 | | 付费 | 薅羊毛 | VPS | | SS | SSR | V2ray | Trojan | Xray | | CN2 | IPLC | IEPL | Anycast | 中转-落地 | 每一项指标都在与 GFW 斗智斗勇,耗费大量时间精力就为了延迟和测速跑分能更好看一些。

python import

目录结构 C:\USERS\EVILMASS\DESKTOP\PATH0 │ server.py ├───path1 │ │ func.py │ │ __init__.py └───path2 │ func.py │ __init__.py ├───path2_1 │ │ func.py │ │ __init__.py │ ├───path2_1_1 │ │ │ func.py │ │ │ special.py │ │ │ __init__.py __init__.py 一个 module1.py 文件可以看作一个模块:import module1,__init__.py 则是将一个文件夹变为 package,每一次 import 都会执行 __init__.py 内的代码。 1 2 3 4 5 6 7 8 # no __init__.py from path2.path2_1.func import echo from path2.path2_1.special import echo_special # has __init__.py from .

Python 多线程笔记

中国有句古话:好记性不如烂笔头。看会了和学会了是两码事,能教会别人说明是真掌握了。 比起一堆 job1 | job2 和 生产者-消费者 模型,单纯复制粘贴相似度 99% 的代码就算自己敲一遍也不会有印象。 反向思考 请写出一个死锁的案例 加锁即为互斥,防止多线程同时修改同一个资源导致数据错误。 A 拿酱油 -> 酱油炒饭耗时10分钟 -> 拿盐 # 等待B放回盐 -> 盐水菜心耗时5分钟 -> 放回盐 -> 放回酱油 B 拿盐 -> 盐水菜心耗时5分钟 -> 拿酱油 # 等待A放回酱油 -> 酱油炒饭耗时10分钟 -> 放回酱油 -> 放回盐 你在等酱油我在盐,两人的下一道菜就永远卡这了。 当然这种写法肯定是有问题的,资源执行和释放的顺序不一致。 解决方法 让步: 只要每个线程执行完任务立马释放相应资源,线程崩溃的话设置好超时释放。 排队: 同时竞争资源,用队列(推荐)解决。 规则: 占用资源前给予规则限制。 例子:5人吃饭同时拿起左边筷子并等待右边筷子的释放。 解决:给筷子编号,没拿到小号筷子前不能拿大号的。最大数字的筷子不可能单独拿到,问题解决。 如果用多进程处理多线程代码,会发生什么 问的其实是二者在使用方面的区别,首先自然是确定多线程代码执行的任务是什么。 如果要处理 `IO密集型`任务,用多进程反而会慢,主要耗时在创建和维护进程过程。 如果处理 `CPU密集型`任务,则可以充分利用多核优势并行计算。 多进程的主要问题: 进程不共享内存,计算的输入必须被传到每个工作进程里,比如列表中的元素; 能被传递的东西必须 picklable,而有相当多的东西是 unpicklable 的; 如果后续程序执行需要并行计算的输出,那么这些输出也得 picklable; Pickle -> unpickle 操作带来了额外的性能开销。 多线程涉及资源竞争&修改、死锁、上下文切换导致效率下降问题。