Python网络编程(进程通信、信号、线程锁、多线程)
用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中的进程捕获到这个信号然后作出一定的操作并最终被终止。信号是UNIX和Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动。通常信号是由一个错误产生的。但它们还可以作为进程间通信或修改行为的一种方式,明确地由一个进程发送给另一个进程。一个信号的产生叫生成,接收到一个信号叫捕获
from signal import * import time def handler(sig,frame): # 自定义处理信号 if sig == SIGALRM: # 判断信号类型 print("收到时钟信号") elif sig == SIGINT: print("就不结束 略略略~") alarm(5) # 设置5秒时钟信号 signal(SIGALRM,handler) signal(SIGINT,handler) # Ctrl + C while True: print("Waiting for a signal") time.sleep(2)
from multiprocessing import Process,Event from time import sleep def wait_event(file): print("准备操作临界资源") e.wait() # 等待主进程执行结束后set print("开始操作临界资源",e.is_set()) fw = open('1.jpg','wb') with open(file,'rb') as f: # 复制图片 fw.write(f.read()) def wait_event_timeout(file): print("也想操作临界资源") e.wait(2) # 等待主进程执行set并进行2秒超时检测 if e.is_set(): print("也开始操作临界资源") fw = open('2.jpg','wb') with open(file,'rb') as f: # 复制图片 fw.write(f.read()) else: print("等不了了,不等了") # 创建事件 e = Event() path = "/home/tarena/file.jpg" file = 'file.jpg' # 创建两个进程分别复制两个图片 p1 = Process(target = wait_event,args = (file,)) p2 = Process(target = wait_event_timeout,args = (file,)) p1.start() p2.start() # 主进程先复制图片 让子进程进入wait状态 print("主进程在操作临界资源") sleep(3) fw = open(file,'wb') with open(path,'rb') as f: fw.write(f.read()) fw.close() e.set() # 子进程set print("主进程操作完毕") p1.join() p2.join()
from multiprocessing import Process,Lock import sys from time import sleep #sys.stdout作为标准输出流是多个进程共有的资源 def writer1(): lock.acquire() #上锁 for i in range(5): sleep(1) sys.stdout.write("writer1输出\n") lock.release() #解锁 # 虽然都sleep1秒但是 若不加锁会每1秒打印两次 # 由于上锁原因 w1执行完临界区w2才能被执行 一秒一次 def writer2(): with lock: for i in range(5): sleep(1) sys.stdout.write("writer2输出\n") #创建锁 lock = Lock() w1 = Process(target = writer1) w2 = Process(target = writer2) w1.start() w2.start() w1.join() w2.join()
from threading import Thread from time import sleep, ctime # 创建一个MyThread类继承Thread class MyThread(Thread): def __init__(self, target, name = "Tedu", args = (), kwargs = {}): super().__init__() # 重新加载父类的__init__初始化方法 self.target = target self.name = name self.args = args self.kwargs = kwargs def run(self): # 在创建对象时自动调用run方法 # 在调用run时调分支线程要执行的线程函数 以*元组和**字典的方式接收万能传参 self.target(*self.args, **self.kwargs) #线程函数 def player(song,sec): for i in range(2): print("Playing %s : %s"%(song, ctime())) sleep(sec) # 用自定义类创建线程并执行 t = MyThread(target = player, args = ("卡路里", 3)) t.start() t.join()
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
C# 不能用于文件名的字符
原文: C# 不能用于文件名的字符 在 Windows 有一些字符是不能作为文件名,尝试重命名一个文件,输入/ 就可以看到windows 提示的不能作为文件名的字符 那么具体是包括哪些符号不能作为文件名? Tilde (~) Number sign (#) Percent (%) Ampersand (&) Asterisk (*) Braces ({ }) Backslash (\) Colon (:) Angle brackets (< >) Question mark (?) Slash (/) Plus sign (+) Pipe (|) Quotation mark (") 上面这些字符不能用来文件名和文件夹名 而且在 windows 的要求,文件是需要有文件名的,虽然你也可以创建.file这样的文件,但是用户是难以自己输入这样的文件名。 之外还有一些文件名是保留,不能创建这样的文件名 CON, PRN, AUX, CLOCK$, NUL COM0, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9 ...
- 下一篇
[雪峰磁针石博客]软件自动化测试初学者忠告
题外话 测试入门 很多受过高等教育的大学生经常问要不要去报测试培训班来入门测试。 答案是否。 高等教育的合格毕业生要具备自学能力,如果你不具备自学能力,要好好地反省一下,为什么自己受了高等教育迷恋于各种入门级别的培训?是没有毅力还是不知道学习方法? 没有毅力的话,要自己多看些励志的书,多想想社会的残酷,亲人的失望等来勉励自己,毕竟企业多半也不会喜欢懒散的人的。 不知道学习方法的话,可以去知乎上看看,有些地方是回答得挺好的。简而言之,读《软件评测师教程》(国内软件评测师教材),《Software Testing Foundations 4th》(强烈推荐 国外测试认证ISTQB教材),《谷歌测试之道》是通常比培训机构更好地入门测试。这些测试入门书籍可以在 qq群144081101 567351477的共享找到。 附录:经典的软件测试基础书籍免费下载 我身边碰到比较有水平的软件测试,没有一个是什么*石、*testing、*林、*鸟、*内等入门测试的。而且这些机构经常打着包就业的名义骗人去培训,培训的老师通常口才很好,善于包装,但是关键的一点,这些老师多数自己都不是合格的测试。培训完之后有些...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Mario游戏-低调大师作品
- CentOS关闭SELinux安全模块
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS6,CentOS7官方镜像安装Oracle11G