本文共 5314 字,大约阅读时间需要 17 分钟。
用过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 + Cwhile True: print("Waiting for a signal") time.sleep(2)
from multiprocessing import Process,Event from time import sleepdef 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() # 子进程setprint("主进程操作完毕")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类继承Threadclass 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()
转载地址:http://easfa.baihongyu.com/