标签:怎样 info 创建线程 自己 初始 强制 主线程 rgs from
用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中的进程捕获到这个信号然后作出一定的操作并最终被终止。信号是UNIX和Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动。通常信号是由一个错误产生的。但它们还可以作为进程间通信或修改行为的一种方式,明确地由一个进程发送给另一个进程。一个信号的产生叫生成,接收到一个信号叫捕获
set,直到A执行完a函数再把B从wait set中激活。这样就保证了B必定在A之后运行,无论在之前它们的时间先后顺序是怎样的。
线程锁的思想是先锁定后序线程,然后让线序线程完成任务再解除对后序线程的锁定。
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()
标签:怎样 info 创建线程 自己 初始 强制 主线程 rgs from
原文地址:https://www.cnblogs.com/ParisGabriel/p/9479088.html