python3核心语法练习题7 线程

题目1:如何让程序暂停执行0.1秒

解答:很简单,我们import time模块,然后使用time.sleep(seconds)方法。

python3核心语法练习题7 线程

题目2:写出一个方法,新建线程来执行它。

解答:使用threading模块来建立新线程。

python3核心语法练习题7 线程

threading.Thread用于建立新线程:

python3核心语法练习题7 线程

其中常用的就是target,也就是你要用线程执行的那个方法。args是方法用的参数列表。name是指定当前线程的名字。

题目3:如何输出当前线程的名字name。

解答:

python3核心语法练习题7 线程

题目4:给自己的程序上锁,防止被拆开执行。

python3核心语法练习题7 线程

当多个线程同时执行lock.acquire()时,只有一个线程能成功地获取锁,然后继续执行代码,其他线程就继续等待直到获得锁为止。

获得锁的线程用完后一定要释放锁,否则那些苦苦等待锁的线程将永远等待下去,成为死线程。所以我们用try...finally来确保锁一定会被释放。

锁的好处就是确保了某段关键代码只能由一个线程从头到尾完整地执行,坏处当然也很多,首先是阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了。其次,由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能会造成死锁,导致多个线程全部挂起,既不能执行,也无法结束,只能靠操作系统强制终止。

题目5:使用threadlocal改写下列程序,使showage和showname函数调用不再传入参数。

python3核心语法练习题7 线程

解答:

python3核心语法练习题7 线程

我们知道多线程环境下,每一个线程均可以使用所属进程的全局变量。如果一个线程对全局变量进行了修改,将会影响到其他所有的线程。为了避免多个线程同时对变量进行修改,引入了线程同步机制,通过互斥锁,条件变量或者读写锁来控制对全局变量的访问。

只用全局变量并不能满足多线程环境的需求,很多时候线程还需要拥有自己的私有数据,这些数据对于其他线程来说不可见。因此线程中也可以使用局部变量,局部变量只有线程自身可以访问,同一个进程下的其他线程不可访问。

有时候使用局部变量不太方便,因此 python 还提供了 ThreadLocal 变量,它本身是一个全局变量,但是每个线程却可以利用它来保存属于自己的私有数据,这些私有数据对其他线程也是不可见的。下图给出了线程中这几种变量的存在情况:

python3核心语法练习题7 线程

其实threadlocal的作用就类似一个全局字典,绑定的过程相当于向字典中加入键值对,而获取的过程相当于从字典中读取值。threadlocal更高级的地方是本线程只能访问本线程的变量,更加线程安全。

这样做的目的是使线程内的函数调用更加简单。达到的结果就是我们例题中的current_thread().name的效果。

ThreadLocal最常用的地方就是为每个线程绑定一个数据库连接,HTTP请求,用户身份信息等,这样一个线程的所有调用到的处理函数都可以非常方便地访问这些资源。


分享到:


相關文章: