-
Notifications
You must be signed in to change notification settings - Fork 6
/
lib03.01-线程和进程.py
51 lines (30 loc) · 1.95 KB
/
lib03.01-线程和进程.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
线程和进程
本章将介绍标准 Python 解释器中所提供的线程支持模块.
注意线程支持模块是可选的, 有可能在一些 Python 解释器中不可用.
3.1.1. 线程
执行 Python 程序的时候, 是按照从主模块顶端向下执行的.
循环用于重复执行部分代码, 函数和方法会将控制临时移交到程序的另一部分.
通过线程, 你的程序可以在同时处理多个任务.
每个线程都有它自己的控制流.
所以你可以在一个线程里从文件读取数据, 另个向屏幕输出内容.
为了保证两个线程可以同时访问相同的内部数据, Python 使用了 global interpreter lock (全局解释器锁) .
在同一时间只可能有一个线程执行 Python 代码; Python 实际上是自动地在一段很短的时间后切换到下个线程执行, 或者等待一个线程执行一项需要时间的操作(例如等待通过 socket 传输的数据, 或是从文件中读取数据).
全局锁事实上并不能避免你程序中的问题.
多个线程尝试访问相同的数据会导致异常状态.
例如以下的代码:
def getitem(key):
item = cache.get(key)
if item is None:
# not in cache; create a new one
item = create_new_item(key)
cache[key] = item
return item
如果不同的线程先后使用相同的 key 调用这里的 getitem 方法, 那么它们很可能会导致相同的参数调用两次 create_new_item .
大多时候这样做没有问题, 但在某些时候会导致严重错误.
不过你可以使用 lock objects 来同步线程.
一个线程只能拥有一个 lock object , 这样就可以确保某个时刻 只有一个线程执行 getitem 函数.
3.1.2. 进程
在大多现代操作系统中, 每个程序在它自身的 进程( process ) 内执行.
我们通过在 shell 中键入命令或直接在菜单中选择来执行一个程序/进程.
Python 允许你在一个脚本内执行一个新的程序.
大多进程相关函数通过 os 模块定义.