python中级第十七课--线程间通信基础知识及常用的队列通信(Queue),非常详细

本文介绍了进程和线程的基本概念,包括并发、并行、同步和异步的差异。接着讨论了进程线程间通信的常见方式,如管道、信号量、消息队列等。重点讲解了Python中的线程安全通信手段——`queue`模块,包括其目的、方法和使用示例,强调了`task_done()`和`join()`的作用,以及固定大小队列、非阻塞和超时机制的应用。
摘要由CSDN通过智能技术生成

常见的基本概念:

首先普及下进程和线程的概念:

进程:进程是操作系统资源分配的基本单位。

线程:线程是任务调度和执行的基本单位。

一个应用程序至少一个进程,一个进程至少一个线程。

两者区别:同一进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独立的。

并发 & 并行:
  并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。简言之,是指系统具有处理多个任务的能力。

并行:当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。简言之,是指系统具有同时处理多个任务的能力。

同步 & 异步:
  对于一次IO访问(以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。所以说,当一个read操作发生时,它会经历两个阶段:
  1. 等待数据准备 (Waiting for the data to be ready)
  2. 将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)
  同步:当进程执行IO(等待外部数据)的时候,-----等。同步(例如打电话的时候必须等)
  异步:当进程执行IO(等待外部数据)的时候,-----不等,去执行其他任务,一直等到数据接收成功,再回来处理。异步(例如发短信)

总结
        只要有一丁点阻塞,就是阻塞IO。异步IO的特点就是全程无阻塞。
        有些人常把同步阻塞和异步非阻塞联系起来,但实际上经过分析,阻塞与同步,非阻塞和异步的定义是不一样的。同步和异步的区别是遇到IO请求是否等待。阻塞和非阻塞的区别是数据没准备好的情况下是否立即返回。同步可能是阻塞的,也可能是非阻塞的,而非阻塞的有可能是同步的,也有可能是异步的。

一般通用(非python层面)的进程线程间通信的常见方式:

进程间通信:
  管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用进程间的亲缘关系通常是指父子进程关系。

命名管道(named pipe/FIFO):命名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

信号量(semophonre):信号量是一个计数器,可以用来控制多个进程队共享资源的访问。它常作为一个锁机制,防止某进程在访问共享资源时,其他进程也访问此资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

消息队列(message queue):消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

信号(sinal):信号是一种比较复杂的通信方式,用于通知接受进程某个事件已经发生。

共享内存(shared memory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的ipc通信方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往和其他通信方式如信号量,配合使用来实现进程间的同步和通信。

套接字(socket):套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同设备间的进程通信。

全双工管道:共享内存、信号量、消息队列、管道和命名管道只适用于本地进程间通信,套接字和全双工管道可用于远程通信,因此可用于网络编程。

线程间通信:
  锁机制:包括互斥锁、条件变量、读写锁
    互斥锁:提供了以排他方式防止数据结构被并发修改的方法。
    读写锁:允许多个线程同时共享数据,而对写操作是互斥的。
    条件变量:可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
    
  信号量机制(Semaphore):包括无名进程信号量和命名线程信号量
  
  信号机制(Signal):类似进程间的信号处理

python中的安全线程通信手段queue:

    目的:

        程序中有多个线程,想在这些线程间实现安全的通信或者交换数据。

    方法:

        在python中将数据从一个线程发送到另外一个线程可能最安全的方法就是使用queue库中的Queue模块了。
        要想做到这些,首先就要创建一个Queue 的实例,所有线程会共享其。之后线程可以通过put()和get()方法来给队列添加和删除元素。

    例子:
from queue import Queue
from threading import Thread

#经典的生产者消费者模式:

# 一个线程专门用于生产数据
def producer(out_q):
    while True:
        # 生产些数据
        ...
        out_q.put(data)

# 一个线程作为消费者用于取出queue中的数据
def consumer(in_q):
    while True:
        # 消耗数据
        data = in_q.get()
        # 处理数据
        ...

q = Queue()
t1 = Thread(target=producer,args=(q,))
t2 = Thread(target=consumer,args=(q,))
t1.start(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白piao

创作不易,支持一下!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值