信号量

信号量规定了能够同时进行这个功能的进程或线程的个数。

进程互斥锁的信号量

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 上厕所

 

posted @ 2017-12-04 19:05  瓜田月夜  阅读(101)  评论(0)    收藏  举报