社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

云妹解读:Python网络编程(进程通信、信号、线程锁、多线程)

阿里云科技快讯 • 5 年前 • 610 次点击  

什么是进程通讯的信号?

用过Windows的我们都知道,当我们无法正常结束一个程序时,

可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?

同样的功能在Linux上是通过生成信号和捕获信号来实现的,

运行中的进程捕获到这个信号然后作出一定的操作并最终被终止。

信号是UNIX和Linux系统响应某些条件而产生的一个事件,

接收到该信号的进程会相应地采取一些行动。通常信号是由一个错误产生的。

但它们还可以作为进程间通信或修改行为的一种方式,

明确地由一个进程发送给另一个进程。一个信号的产生叫生成,接收到一个信号叫捕获

什么是线程锁?

1.在单一进程的情况下可以叫单进程也可以叫单线程

2.线程锁的大致思想是:如果线程A和线程B会执行实例的两个函数a和b

如果A必须在B之前运行,那么可以在B进入b函数时让B进入wait

set,直到A执行完a函数再把B从wait set中激活。这样就保证了B必定在A之后运行,无论在之前它们的时间先后顺序是怎样的。 3. 线程锁用于必须以固定顺序执行的多个线程的调度

线程锁的思想是先锁定后序线程,然后让线序线程完成任务再解除对后序线程的锁定。

信号:

一个进程通过信号的方式传递某种讯息

接收方收到信号后作出相应的处理

kill -sig pid:通过pid发送信号杀死指定进程

kill -l查看操作系统内所所有sig信号

关于信号:

信号名称: 系统定义,名字或数字

信号含义:系统定义,信号的作用

默认处理方法:

当一个进程接收到信号时默认产生的效果

进程终止暂停进程、忽略法发生

SIGHUP: 断开链接

SIGINT: Ctrl + c

SIGQUIT: Ctrl +

SIGTSTP : Ctrl + z

SIGKILL: 终止进程且不能被处理

SIGSTOP: 暂停进程且不能被处理

SIGALRM: 时钟信号

SIGCHLD: 子进程改变状态时父进程会收到此信号

Python信号处理:(signal模块)

os.kill(pid,sig)

功能:

发送一个信号给某个进程

参数:

pid:给那个进程发送信号(进程pid)

sig:要发送的信号类型

signal.alarm(sec)

功能:

异步执行

设置时钟信号

一定时间后给自己发送一个SIGALRM信号

一个进程只能挂起一个时钟

重新挂起时钟会覆盖之前时钟

参数:

sec:时间(秒)

signal.pause()

功能:

阻塞进程,等待一个信号

signal.signal(sig,handler)

功能:信号处理

参数:

sig:要处理的信号

handler:信号处理方法

可选值:

SIG_DFL 表示使用默认方法处理

SIG_IGN 表示忽略这个信号

func 自定义函数

自定义函数格式:

def func(sig,frame):

sig:收到的信号

frame:信号结构对象

signal函数一个异步处理函数,只要执行了该函数

则进程任意时候接受到相应的信号都会处理

signal不能处理SIGKILL 、SIGSTOP

父进程中可以使用 signal(SIGCHLD,SIG_IGN

子进程退出交给系统处理

程序的异步和同步执行:

单进程的同步异步

同步:

程序按照步骤一步步执行,呈现一个先后性的顺序

异步:

信号是唯一一个内部通信方式

程序在执行中利用内核功帮助完成必要的辅助操作

不影响应用层的持续执行

信号是一种异步的进程间通讯方法

示例:

信号量:

给定一定的数量,对多个进程可见,

并且多个进程根据信号量的多少确定不同行为

sem = Semaphore(num)

功能:创建信号量

参数:信号量初始值

返回值:信号量对象

sem.acquire()

将信号数量减1 当数量为0时阻塞

sem.release()

将信号量加1

sem.get_value()

获取当前信号量的值(数量

同步互斥机制

目的:

解决共有资源产生的资源争夺

临界资源:

多个进程或线程都可以操作的资源

临界区

操作临界资源的代码段

同步:

同步一种合作关系,为完成某个任务,

进程或者多个线程之间形成的一种协调

按照约定执行,相互告知,共同完成任务

互斥:

互斥一种制约关系,当一个进程或者线程

进入临界区操作资源时采用上锁的方式,

阻止其他进程操作,直到解锁后才能让出资源

Event事件:

from multiprocessing import Event

创建事件对象

e = Event()

事件阻塞

e.wait([timeout])

功能:

使进程处于阻塞状态,直到事件对象被set

事件设置

e.set.()

功能:

让事件对象变为被设置状态

清除设置:

e.clear()

功能:使事件对象清除设置状态

事件判断:

e.is_set()

判断当前事件是否被set

示例:

锁 Look

multiprocessing --> Look

创建对象:

Lock = Lock()

lock.acquire() 上锁

lock.release() 解锁

如果一个锁对象已经被上锁调用会阻塞

multiprocessing 创建的子进程不能用input 会报错

示例:

多线程:

什么是线程(thread

线程也是一种多任务编程方式,可以使用计算机的多核资源

线程被称为轻量级的进程

线程的特征:

1.一个进程可以包含多个线程

2.线程是计算机内核使用的最小单位

3.线程也是一个运行过程,也要消耗计算机资源

4.多个线程共享共用进程的资源

5.线程也有自己特征属性TID指令集线程栈

6.多个线程之间独立运行互不干扰 空间不独立(都消耗进程空间)

7.线程的创建删除消耗的资源小于进程 线程/进程(1/20

threading 模块

threshold.Thread()

功能:

创建线程对象

参数:

target 线程函数

name 线程名 默认为Thread-1...

args 元组给线程函数位置传参

kwargs 字典给线程函数键值传参

返回值:

线程对象

t.start() 启动线程

t.join() 回收线程

线程对象属性:

t.name 线程名

t.setName() 设置线程名称

t.is_alive()查看线程状态

threading.currentThread() 获取当前进程对象

t.daemon属性

默认False主线程的退出不会影响分支线程的执行

设置为True时主线程退出分支线程也退出

设置daemon值

t.setDaemon(True)

t.daemon = True

查看daemon值

t.isDaemon

创建自己的线程类;

1.继承Thread

2.加载父类__init__

3.重写run

示例:

本文来自阿里云云栖社区,未经允许不得转载。

了解更多

关注简书账号:阿里云科技快讯 并私信小编接口暗号“Hello World”,云栖大会300份干货PPT属于你!


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/MPMSx4i7cM
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/22766
 
610 次点击