《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任务”

Python Cookbook 笔记--12章并发编程的更多相关文章

  1. 《C#并发编程经典实例》学习笔记-第一章并发编程概述

    并发编程的术语 并发 同时做多件事情 多线程 并发的一种形式,它采用多个线程来执行程序. 多线程是并发的一种形式,但不是唯一的形式. 并行处理 把正在执行的大量的任务分割成小块,分配给多个同时运行的线 ...

  2. [CSAPP笔记][第十二章并发编程]

    第十二章 并发编程 如果逻辑控制流在时间上是重叠,那么它们就是并发的(concurrent).这种常见的现象称为并发(concurrency). 硬件异常处理程序,进程和Unix信号处理程序都是大家熟 ...

  3. CSAPP:第十二章 并发编程

    CSAPP:第十二章 并发编程 12.1 线程执行模型12.2 多线程之间并发通信12.3 其他并发问题   使用应用级并发的应用程序称为并发程序.现代操作系统提供三种基本的构造并发程序的方法: 进程 ...

  4. python学习笔记12 ----线程、进程

    进程和线程的概念 进程和线程是操作系统中两个很重要的概念,对于一般的程序,可能有若干个进程,每一个进程有若干个同时执行的线程.进程是资源管理的最小单位,线程是程序执行的最小单位(线程可共享同一进程里的 ...

  5. python 学习笔记 12 -- 写一个脚本获取城市天气信息

    近期在玩树莓派,前面写过一篇在树莓派上使用1602液晶显示屏,那么可以显示后最重要的就是显示什么的问题了. 最easy想到的就是显示时间啊,CPU利用率啊.IP地址之类的.那么我认为呢,假设可以显示当 ...

  6. 学习笔记:java并发编程学习之初识Concurrent

    一.初识Concurrent 第一次看见concurrent的使用是在同事写的一个抽取系统代码里,当时这部分代码没有完成,有许多的问题,另一个同事接手了这部分代码的功能开发,由于他没有多线程开发的经验 ...

  7. 笔记:java并发编程实践1

    Java 5.0 adds ConcurrentHashMap, a replacement for synchronized hash-based Map implementations, and ...

  8. java并发编程--第一章并发编程的挑战

    一.java并发编程的挑战 并发编程需要注意的问题: 并发编程的目的是让程序运行的更快,然而并不是启动更多的线程就能让程序最大限度的并发执行.若希望通过多线程并发让程序执行的更快,会受到如下问题的挑战 ...

  9. 深入理解计算机系统 第十二章 并发编程 part1 第二遍

    三种构造并发程序的方法及其优缺点 1.进程 用这种方法,每个逻辑控制流都是一个进程,由内核来调度和维护.因为进程有独立的虚拟地址空间,想要和其他流通信,控制流必须使用某种显式的进程间通信机制. 优点: ...

随机推荐

  1. Unique ID Generate Notes

    Unique ID generation in distributed systems http://www.slideshare.net/davegardnerisme/unique-id-gene ...

  2. SpringBoot(七)-- 启动加载数据

    一.场景 实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求.为了解决这样的问题,spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunn ...

  3. Python 基础进阶

    函数的定义 函数的参数 函数的默认参数 函数的变量 函数的返回值 函数的多类型传值 函数的冗余参数 函数的递归调用 匿名函数 高阶函数 内建函数 模块与包 面向对象 类的定义 类的属性 类的内置属性 ...

  4. sqlite3错误码整理

    #define SQLITE_OK /* 成功 | Successful result */ /* 错误码开始 */ #define SQLITE_ERROR /* SQL错误 或 丢失数据库 | S ...

  5. 查看linux系统类型、版本、位数

    如何查看LINUX操作系统是多少位的 方法1: 查看linux是不是64位的命令! file /sbin/init 结果会出来 xx bit 方法二: # getconf LONG_BIT32getc ...

  6. 《C++ Primer Plus》16.2 智能指针模板类

    智能指针是行为类似于指针的类对象,单这种对象还有其他功能.本节介绍三个可帮助管理动态内存分配的智能指针类.先来看看需要哪些功能以及这些功能是如何实现的.请看下面的函数:void remodel(std ...

  7. iOS - UITableViewStylePlain与UITableViewStyleGroup样式的对比

    一.UITableViewStylePlain 1.有多段时 段头停留(自带效果) 2.没有中间的间距和头部间距(要想有的重写UITableViewCell \UITableViewHeaderFoo ...

  8. RabbitMQ笔记四:Binding,Queue,Message概念

    Binding详解   黄线部分就是binding Exchange与Exchange,Queue之间的虚拟连接,Binding中可以包含Routing key或者参数   创建binding 注意: ...

  9. Android Studio中R报错(cnanot resolve symbol R)

    我的解决办法: Tools -> Android -> Sync Project with Gradle Files Build -> Clean Project 然后就好了 PS: ...

  10. golang文件传输服务

    续上篇,本篇介绍一个完整的golang文件传输服务器. 完整的代码可以看服务器,客户端 网络使用的框架如上篇介绍,这里就不再复述. 首先定义3个命令码: const ( request_file = ...