博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python Cookbook 笔记--12章并发编程
阅读量:6982 次
发布时间:2019-06-27

本文共 1352 字,大约阅读时间需要 4 分钟。

《Python Cookbook(第3版)中文版》

1、队列queue的有些方法是线程不安全的,在多线程中最好别用

2、需要限制一段代码的并发访问量时,用信号量。不要把信号量当做普通的锁来用,当做普通的锁来用,其性能不如普通的锁

3、个人对阻塞和挂起的理解:阻塞是被动的,是拿不到需要的资源导致的;挂起是主动地,是某个条件不满足自己的要求,于是wait一会

4、为了避免死锁,每个线程一次之获取一个锁;若一定要获取多个锁,你就需要更高级的死锁避免机制,我们将在 12.5 节介绍

5、解决死锁问题的一种方案是为程序中的每一个锁分配一个唯一的 id,然后只允许按照升序规则来使用多个锁,这样做不会产生循环依赖,而循环依赖是死锁的一个必要条件,所以避免了死锁

6、死锁的检测与恢复是一个几乎没有优雅的解决方案的扩展话题。一个比较常用的死锁检测与恢复的方案是引入看门狗计数器。

7、创建一个本地线程存储对象:thread.local() 。对这个对象的属性的保存和读取操作都只会对执行线程可见,而其他线程并不可见

8、个人:编写多线程时,要注意你是用的某个对象是否是“线程安全”的

 9、因为有全局解释锁GIL,所以你应该只在 I/O 处理相关代码中使用线程池

10、如果你担心虚拟内存大小,可以使用 threading.stack size() 函数来降低它。

threading.stack_size(65536)

11、使用进程池时有几个注意事项,详见python cookbook的“12.8 简单的并行编程”

12、因为GIL,python的多线程不能利用多核CPU的优势。GIL 只会影响到那些严重依赖 CPU的程序(比如计算型的)。如果你的程序大部分只会设计到 I/O,比如网络交互,那么使用多线程就很合适,因为它们大部分时间都在等待

13、处理运算密集型任务时,有两种方法解决GIL问题:1)当一个线程想要执行 CPU密集型工作时,会将任务发给进程池。然后进程池会在另外一个进程中启动一个单独

的 Python 解释器来工作。当线程等待结果的时候会释放 GIL。并且,由于计算任务在单独解释器中执行,那么就不会受限于 GIL 了   2)另外一个解决 GIL 的策略是使用 C 扩展编程技术。主要思想是将计算密集型任务
转移给 C,跟 Python 独立,在工作的时候在 C 代码中释放 GIL

14、根据输入跳到不通的函数

class TaggedActor(Actor):

def run(self):
  while True:
    tag, *payload = self.recv()
    getattr(self,'do_'+tag)(*payload)
# Methods correponding to different message tags
def do_A(self, x):
  print('Running A', x)
def do_B(self, x, y):
  print('Running B', x, y)

15、没看明白“定义一个actor任务”

 

转载于:https://www.cnblogs.com/testzcy/p/6821142.html

你可能感兴趣的文章
LINQ之路19:LINQ to XML之X-DOM更新、和Value属性交互
查看>>
笔记之远程桌面服务(RDS)
查看>>
怎样操作vue.js使用3DES加密
查看>>
js实现点击<li>标签弹出其索引值
查看>>
DIV限制宽度,字符断行,避免变形
查看>>
通过进程ID获得该进程主窗口的句柄
查看>>
快速把web项目部署到weblogic上
查看>>
.Net 文件流 System.IO之Stream
查看>>
Jmeter 笔记
查看>>
一个JS对话框,可以显示其它页面,
查看>>
IDEA ctrl+alt+L 格式化快捷键无效时解决
查看>>
前端小知识
查看>>
子弹实例化的代码
查看>>
URAL 2027 URCAPL, Episode 1 (模拟)
查看>>
hadoop install start-dfs.sh 失败
查看>>
各种小记
查看>>
Java关键字final、static使用总结
查看>>
Bootstrap 模态框上下居中
查看>>
SQL Server不能启动
查看>>
【Vue】IView之table组件化学习(二)
查看>>