Python多线程编程详解——以2.X版本为例

版权申诉
0 下载量 89 浏览量 更新于2024-11-14 收藏 226KB RAR 举报
资源摘要信息:"Python多线程" 知识点概述: 1. Python多线程基础 Python是一种广泛使用的高级编程语言,它内置了对多线程编程的支持。多线程是一种允许多个线程同时存在于程序中的编程范式,这使得程序能够执行并发任务,即同时运行多个任务。Python的多线程功能是通过threading模块实现的,该模块提供了创建和管理线程的API。 2. 全局解释器锁(GIL) Python多线程中的一个关键知识点是全局解释器锁(Global Interpreter Lock,GIL)。GIL是一个互斥锁,它使得任何时候只有一个线程可以执行Python字节码。这意味着,尽管Python支持多线程,但是由于GIL的存在,一个Python进程在同一时间内只能利用一个CPU核心。因此,在多线程环境中,线程的执行并不是真正的并行,而是并发(interleaved)的。 3. thread模块与threading模块 Python早期版本中有一个thread模块,它简单地封装了线程的基本功能。然而,从Python 2.6开始,开发者被推荐使用更为强大和灵活的threading模块。threading模块提供了对线程的更高级的控制,比如线程同步和线程间通信的功能。 4. 线程创建和启动 在Python的threading模块中,创建线程的基本步骤包括定义一个继承自threading.Thread类的子类,并在其run()方法中定义线程要执行的任务。然后,创建这个子类的实例,并调用其start()方法来启动线程。这将使Python解释器安排线程执行run()方法中的代码。 5. 线程同步机制 由于线程可以访问共享资源,可能会出现线程安全问题。Python提供了多种线程同步机制来避免这些问题,包括锁(Locks)、事件(Events)、条件变量(Conditions)、信号量(Semaphores)等。锁是最基本的同步机制,它确保同一时间只有一个线程可以访问某个资源。事件允许线程在某个事件发生时被唤醒。条件变量可以让线程等待某个条件为真时再继续执行。信号量可以用来控制对共享资源访问的数量限制。 6. 线程间通信 在多线程程序中,线程间通信(Inter-thread Communication)也很重要。Python的threading模块通过Queue(队列)来提供线程间的通信机制。Queue是一个线程安全的队列,可以安全地在多个线程之间传递数据。通过队列,线程可以将任务、数据或其他消息传递给其他线程,而无需担心竞态条件。 7. 多线程的应用场景 Python多线程适合于I/O密集型任务,如文件操作、网络通信等,因为这些操作大部分时间都在等待,而GIL不会限制等待时间。对于计算密集型任务,由于GIL的存在,Python多线程可能不会带来预期的性能提升,此时可以考虑使用多进程(通过multiprocessing模块实现)或者其他并发执行方案,如异步编程(通过asyncio模块实现)。 8. Python 2.X版本的特性 由于本资源是基于Python 2.X版本的多线程编程介绍,需要特别注意的是Python 2.X系列已于2020年停止支持。因此,当前进行Python多线程编程时应当使用Python 3.X版本。Python 3.X版本在多线程方面的改进包括更好的性能和更完善的库支持。 9. 并发编程的未来方向 随着Python的发展,对于并发和并行的编程需求也日益增长。除了多线程和多进程,开发者还可以利用异步编程(async/await语法),以及诸如concurrent.futures这样的高级抽象来处理复杂的并发问题。此外,第三方库如asyncio提供了一套用于异步I/O操作的基础设施。 10. 实践建议 在实际开发中,建议深入理解Python多线程的工作原理以及GIL的影响。对于多线程编程实践,应当充分考虑线程安全和线程间通信的问题。在项目中合理选择使用多线程、多进程或是异步编程,并根据具体需求选择合适的并发模式。对于需要高性能计算的场景,考虑使用支持真正并行的解决方案,如使用C扩展、Numpy进行科学计算等。 在学习Python多线程时,可通过阅读相关的官方文档、优秀的编程书籍以及在线教程来加深理解,并通过编写示例代码和实际项目来提高自己的实践经验。通过不断实践和学习,开发者可以更好地利用Python的多线程特性来编写高效、可维护的代码。

class MainWindow(QMainWindow): def init(self, user_id): super().init() self.user_id = user_id self.initUI() # 打开串口 self.ser = serial.Serial('COM7', 9600, timeout=1) def initUI(self): # 创建用于显示员工信息的控件 self.info_label = QLabel("员工信息", self) self.info_label.move(100, 50) self.info_label.setStyleSheet("font-size: 24px; color: black; background-color: #eee; border-radius: 10px;") self.id_label = QLabel("员工ID:", self) self.id_label.move(70, 100) self.id_label.setStyleSheet("font-size: 18px; color: black;") self.name_label = QLabel("姓名:", self) self.name_label.move(70, 150) self.name_label.setStyleSheet("font-size: 18px; color: black;") self.six_label = QLabel("性别:", self) self.six_label.move(70, 200) self.six_label.setStyleSheet("font-size: 18px; color: black;") self.sfz_label = QLabel("身份证:", self) self.sfz_label.move(70, 250) self.sfz_label.setStyleSheet("font-size: 18px; color: black;") self.tel_label = QLabel("电话:", self) self.tel_label.move(70, 300) self.tel_label.setStyleSheet("font-size: 18px; color: black;") self.setFixedSize(800, 500) self.setWindowTitle('员工信息') # 查询员工信息 def query_employee(self, id): conn = pymysql.connect(host='39.99.214.172', user='root', password='Solotion.123', database='jj_tset') cursor = conn.cursor() cursor.execute("SELECT * FROM employee_table WHERE user_id='%s'" % id) result = cursor.fetchone() conn.close() return result # 读取数据 def read_data(self): data = self.ser.readline() if data: # 解析数据 id = data.decode().strip() # 查询员工信息 result = self.query_employee(id) if result: # 更新UI界面 self.id_label.setText("员工ID:" + result[0]) self.name_label.setText("姓名:" + str(result[1])) self.six_label.setText("性别:" + result[2]) self.sfz_label.setText("身份证:" + str(result[3])) self.tel_label.setText("电话:" + result[4]) print(result[0],result[1],result[2],result[3],result[4]) else: # 显示空白信息 self.id_label.setText("员工ID:") self.name_label.setText("姓名:") self.six_label.setText("性别:") self.sfz_label.setText("身份证:") self.tel_label.setText("电话:") # 定时读取数据 QTimer.singleShot(100, self.read_data) def closeEvent(self, event): # 关闭串口 self.ser.close()用多线程改写代码,防止主线程阻塞

2023-05-27 上传