Python数据分析与可视化:实战案例解析
136
2023-10-25
【摘要】 本书摘自《零基础Python 从入门到精通》一书中第12章,第2.3节,编者是壹零快学。
12.2.3 线程同步
如果有多个线程共同修改或者操作同一个对象或者数据,就有可能会发生一些意想不到的事情,例如:
动手写12.2.5
基 础 Python 从 入 门 到 精 通
我们可以尝试多次运行这个例子,每次执行这个例子,程序在屏幕上输出的结果都不太相 同, 而且不同的线程输出的内容有许多都叠加在一起,无法区分,这就是前面所说的多线程的不确定性。为了保证数据的正确性,我们需要将多个线程进行同步。
标准库threading中有Lock对象可以实现简单的线程同步(threading.Lock其实调用的就是_thread. allocate_lock获取Lock对象)。多线程的优势在于可以同时运行多个任务,但是当线程需要处理同 一个资源时,就需要考虑数据不同步的问题了(print对应的其实就是stdout)。
动手写12.2.6
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import time
import threading
thread_lock = None
class MyThread(threading.Thread):
def__init__(self, thread_id):
super(MyThread, self).__init__()
self.thread_id = thread_id
def run(self):
# 锁定
thread_lock.acquire()
for i in range(3):
print("Thread %d\t printing! times: %d" % (self.thread_id, i))
# 释放
thread_lock.release()
time.sleep(1)
# 锁定
thread_lock.acquire()
for i in range(3):
print("Thread %d\t printing! times: %d" % (self.thread_id, i))
# 释放
thread_lock.release()
def main():
print("Main thread start")
threads = []
基 础 Python 从 入 门 到 精 通
第 12 章 多线程与并行
我们可以从执行结果中看到,加了锁之后的线程不再像之前的例子那么不可控制了。每次执 行都会得到相同的结果,并且例子中的五个线程是“同时”在执行的。当子线程运行到thread_lock. acquire()的时候,程序会判断thread_lock是否处于锁定状态,如果是锁定状态,线程就会在这一行 阻塞,直到锁被释放为止。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~