Skip to content

Commit 21bb590

Browse files
committed
1.0.2版修订版
1 parent d31aa5a commit 21bb590

6 files changed

+19
-13
lines changed

source/c12/p01_start_stop_thread.rst

+5-5
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
当你创建好一个线程对象后,该对象并不会立即执行,除非你调用它的 ``start()`` 方法(当你调用 ``start()`` 方法时,它会调用你传递进来的函数,并把你传递进来的参数传递给该函数)。Python中的线程会在一个单独的系统级线程中执行(比如说一个 POSIX 线程或者一个 Windows 线程),这些线程将由操作系统来全权管理。线程一旦启动,将独立执行直到目标函数返回。你可以查询一个线程对象的状态,看它是否还在执行:
3232

3333
.. code-block:: python
34-
34+
3535
if t.is_alive():
3636
print('Still running')
3737
else:
@@ -47,7 +47,7 @@ Python解释器在所有线程都终止后才继续执行代码剩余的部分
4747
例如:
4848

4949
.. code-block:: python
50-
50+
5151
t = Thread(target=countdown, args=(10,), daemon=True)
5252
t.start()
5353
@@ -79,7 +79,7 @@ Python解释器在所有线程都终止后才继续执行代码剩余的部分
7979
例子如下:
8080

8181
.. code-block:: python
82-
82+
8383
class IOTask:
8484
def terminate(self):
8585
self._running = False
@@ -106,7 +106,7 @@ Python解释器在所有线程都终止后才继续执行代码剩余的部分
106106
有时你会看到下边这种通过继承 ``Thread`` 类来实现的线程:
107107

108108
.. code-block:: python
109-
109+
110110
from threading import Thread
111111
112112
class CountdownThread(Thread):
@@ -126,7 +126,7 @@ Python解释器在所有线程都终止后才继续执行代码剩余的部分
126126
尽管这样也可以工作,但这使得你的代码依赖于 ``threading`` 库,所以你的这些代码只能在线程上下文中使用。上文所写的那些代码、函数都是与 ``threading`` 库无关的,这样就使得这些代码可以被用在其他的上下文中,可能与线程有关,也可能与线程无关。比如,你可以通过 ``multiprocessing`` 模块在一个单独的进程中执行你的代码:
127127

128128
.. code-block:: python
129-
129+
130130
import multiprocessing
131131
c = CountdownTask(5)
132132
p = multiprocessing.Process(target=c.run)

source/c12/p02_determining_if_thread_has_started.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
event 对象最好单次使用,就是说,你创建一个 event 对象,让某个线程等待这个对象,一旦这个对象被设置为真,你就应该丢弃它。尽管可以通过 ``clear()`` 方法来重置 event 对象,但是很难确保安全地清理 event 对象并对它重新赋值。很可能会发生错过事件、死锁或者其他问题(特别是,你无法保证重置 event 对象的代码会在线程再次等待这个 event 对象之前执行)。如果一个线程需要不停地重复使用 event 对象,你最好使用 ``Condition`` 对象来代替。下面的代码使用 ``Condition`` 对象实现了一个周期定时器,每当定时器超时的时候,其他线程都可以监测到:
5151

5252
.. code-block:: python
53-
53+
5454
import threading
5555
import time
5656

source/c12/p03_communicating_between_threads.rst

+6-5
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
例如:
1616

1717
.. code-block:: python
18+
1819
from queue import Queue
1920
from threading import Thread
2021
@@ -103,7 +104,7 @@
103104
使用队列来进行线程间通信是一个单向、不确定的过程。通常情况下,你没有办法知道接收数据的线程是什么时候接收到的数据并开始工作的。不过队列对象提供一些基本完成的特性,比如下边这个例子中的 ``task_done()`` 和 ``join()`` :
104105

105106
.. code-block:: python
106-
107+
107108
from queue import Queue
108109
from threading import Thread
109110
@@ -138,7 +139,7 @@
138139
如果一个线程需要在一个“消费者”线程处理完特定的数据项时立即得到通知,你可以把要发送的数据和一个 ``Event`` 放到一起使用,这样“生产者”就可以通过这个Event对象来监测处理的过程了。示例如下:
139140

140141
.. code-block:: python
141-
142+
142143
from queue import Queue
143144
from threading import Thread, Event
144145
@@ -171,7 +172,7 @@
171172
使用线程队列有一个要注意的问题是,向队列中添加数据项时并不会复制此数据项,线程间通信实际上是在线程间传递对象引用。如果你担心对象的共享状态,那你最好只传递不可修改的数据结构(如:整型、字符串或者元组)或者一个对象的深拷贝。例如:
172173

173174
.. code-block:: python
174-
175+
175176
from queue import Queue
176177
from threading import Thread
177178
import copy
@@ -216,7 +217,7 @@
216217
这些操作都可以用来避免当执行某些特定队列操作时发生无限阻塞的情况,比如,一个非阻塞的 ``put()`` 方法和一个固定大小的队列一起使用,这样当队列已满时就可以执行不同的代码。比如输出一条日志信息并丢弃。
217218

218219
.. code-block:: python
219-
220+
220221
def producer(q):
221222
...
222223
try:
@@ -227,7 +228,7 @@
227228
如果你试图让消费者线程在执行像 ``q.get()`` 这样的操作时,超时自动终止以便检查终止标志,你应该使用 ``q.get()`` 的可选参数 ``timeout`` ,如下:
228229

229230
.. code-block:: python
230-
231+
231232
_running = True
232233
233234
def consumer(q):

source/c12/p04_locking_critical_sections.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
在一些“老的” Python 代码中,显式获取和释放锁是很常见的。下边是一个上一个例子的变种:
4949

5050
.. code-block:: python
51-
51+
5252
import threading
5353
5454
class SharedCounter:

source/c12/p05_locking_with_deadlock_avoidance.rst

+5
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
是非常容易实现的,示例如下:
1717

1818
.. code-block:: python
19+
1920
import threading
2021
from contextlib import contextmanager
2122
@@ -50,6 +51,7 @@
5051
示例如下:
5152

5253
.. code-block:: python
54+
5355
import threading
5456
x_lock = threading.Lock()
5557
y_lock = threading.Lock()
@@ -78,6 +80,7 @@
7880
假设你的代码是这样写的:
7981

8082
.. code-block:: python
83+
8184
import threading
8285
x_lock = threading.Lock()
8386
y_lock = threading.Lock()
@@ -106,6 +109,7 @@
106109
如果你运行这个版本的代码,必定会有一个线程发生崩溃,异常信息可能像这样:
107110

108111
.. code-block:: python
112+
109113
Exception in thread Thread-1:
110114
Traceback (most recent call last):
111115
File "/usr/local/lib/python3.3/threading.py", line 639, in _bootstrap_inner
@@ -145,6 +149,7 @@
145149
下面是一个简单的使用死锁避免机制解决“哲学家就餐问题”的实现:
146150

147151
.. code-block:: python
152+
148153
import threading
149154
150155
# The philosopher thread

source/c12/p06_storing_thread_specific_state.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
其他方法操作被存储为 ``self.local.sock`` 的套接字对象。
4747
有了这些就可以在多线程中安全的使用 ``LazyConnection`` 实例了。例如:
4848

49-
::
49+
.. code-block:: python
5050
5151
from functools import partial
5252
def test(conn):

0 commit comments

Comments
 (0)