信号量
信号量规定了能够同时进行这个功能的进程或线程的个数。
进程互斥锁的信号量
from multiprocessing import Process,Semaphore import time,random,os def task(sm): with sm: print('%s 上厕所' %os.getpid()) time.sleep(random.randint(1,3)) #相当于 #sm.acquire() #print('%s 上厕所' % os.getpid()) #time.sleep(random.randint(1,3)) #sm.release() if __name__ == '__main__': sm=Semaphore(3) for i in range(10): p=Process(target=task,args=(sm,)) p.start() #执行结果 3756 上厕所 12456 上厕所 3668 上厕所 8756 上厕所 14836 上厕所 8332 上厕所 13508 上厕所 10332 上厕所 15944 上厕所 12044 上厕所
信号量与池的不同是池规定的是同时工作的进程或线程的最大数量,而信号量规定的是同时处理一个任务的最大进程或线程数量。
信号量中可以有多个进程或线程,但处理那个任务的进程或线程不超过设定的最大值。
线程互斥锁的信号量
线程互斥锁信号量与进程互斥锁信号量用法相同
from threading import Thread,Semaphore import time,random,os,current_thread def task(sm): with sm: print('%s 上厕所' %current_thread().getName()) time.sleep(random.randint(1,3)) if __name__ == '__main__': sm=Semaphore(3) for i in range(10): p=Thread(target=task,args=(sm,)) p.start() #结果 Thread-1 上厕所 Thread-2 上厕所 Thread-3 上厕所 Thread-4 上厕所 Thread-5 上厕所 Thread-6 上厕所 Thread-7 上厕所 Thread-8 上厕所 Thread-9 上厕所 Thread-10 上厕所