一文攻克Python的线程以及线程间通信(队列)以及互斥锁的使用

本文详细介绍了Python中的线程创建、线程间通信(包括全局变量共享和队列通信)以及互斥锁的使用。通过示例展示了如何使用线程和互斥锁确保数据的正确性。此外,还探讨了线程与进程的主要区别,强调了线程间的资源共享和进程间的独立性。

一、什么是线程

如果需要同时处理多个任务,一种是可以在一个应用程序内使用多个进程,每个进程负责完成一部分工作;另一种将工作细分为多个任务的方法是使用一个进程内的多个线程。那么,什么是线程呢?

线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。例如,对于视频播放器,显示视频用一个线程,播放音频用另一个线程。只有2个线程同时工作,我们才能正常观看画面和声音同步的视频。

举一个生活中的例子来更好的理解进程和线程的关系。一个进程就像一座房子,它是一个容器,有着相应的属性,如占地面积、卧室、厨房和卫生间等。房子本身并没有主动地做任何事情而线程就是这座房子的居住者,他可以使用房子内每一个房间、做饭、洗澡等。

二、创建线程

由于线程是操作系统直接支持的执行单元,因此,高级语言(如Python、Java等)通常都内置多线程的支持。Python 的标准库提供了两个模块:_thread和 threading,_thread是低级模块,threading 是高级模块,对_thread进行了封装。绝大多数情况下,我们只需要使用threading这个高级模块。

1、使用threading模块创建线程

threading模块提供了一个Thread类来代表一个线程对象,语法如下:

Thread( [group [ , target [, name [, args [,kwargs]]]]])

Thread类的参数说明如下:

  • group :值为None,为以后版本而保留。
  • target:表示一个可调用对象,线程启动时,run()方法将调用此对象,默认值为None,表示不调用任何内容。
  • name表示当前线程名称,默认创建一个“Thread-N”格式的唯一名称。args :表示传递给target()函数的参数元组。
  • kwargs :表示传递给
  • target()函数的参数字典。
import threading,time

def process():
    for i in range(3):
        time.sleep(2)
        print("thread name is %s"%threading.current_thread().name)

if __name__=="__main__":
    print("----主线程开始----")
    #创建4个线程,存入列表
    threads = [threading.Thread(target=process) for i in range(4)]
    for t in threads:
        t.start()        #分别开启每个线程
    for t in threads:
        t.join()         #主线程阻塞,等待每个子线程结束
    print("----主线程结束----")

在这里插入图片描述
可以看出,线程执行的顺序是不确定的。

2、使用Thread子类创建线程

import threading,time
class SubThread(threading.Thread):
   def run(self):
       for i in range(3):
           time.
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值