27 python 初学(信号量条件变量同步条件队列)

Posted mlllily

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了27 python 初学(信号量条件变量同步条件队列)相关的知识,希望对你有一定的参考价值。

参考博客: www.cnblogs.com/yuanchenqi/articles/5733873.html 

semaphore 信号量:

condition 条件变量:

event 同步条件:条件同步和条件变量同步差不多意思,只是少了锁功能。因为条件同步设计于别访问共享资源的条件环境

 

多线程利器(queue):队列本身有一把锁

q.put(‘xiaoming’, 0)

q.get(0)

q.qsize()  返回队列大小

q.empty()

q.full()

semaphore:

# _author: lily
# _date: 2019/1/29

import threading , time

class MyThread(threading.Thread):
    def run(self):
        if semaphore.acquire():
            print(self.name)
            time.sleep(3)
            semaphore.release()

if __name__ == \'__main__\':
    semaphore = threading.BoundedSemaphore(5)
    thread_list = []
    for i in range(100):
        thread_list.append(MyThread())
    for i in thread_list:
        i.start()
View Code

condition:

# _author: lily
# _date: 2019/1/29

import threading,time
from random import randint

class Producer(threading.Thread):
    def run(self):
        global L
        while True:
            val = randint(0, 100)
            print(\'Producer\', self.name, \': Append\', str(val), L)
            if lock_con.acquire():
                L.append(val)
                lock_con.notify()
                lock_con.release()
            time.sleep(3)

class Consumer(threading.Thread):
    def run(self):
        global L
        while True:
            lock_con.acquire()
            if len(L) == 0:
                lock_con.wait()
                print(\'Consumer\', self.name, \': Delete\', str(L[0]), L)
                del L[0]
                lock_con.release()
                time.sleep(0.25)


if __name__ == \'__main__\':
    L = []
    lock_con = threading.Condition()
    threads = []
    for i in range(5):
        threads.append(Producer())
    threads.append(Consumer())
    for t in threads:
        t.start()
    for t in threads:
        t.join()
View Code

queue:

# _author: lily
# _date: 2019/1/30

import queue

# q = queue.Queue()

q = queue.Queue(3)  # 设置队列大小
q.put(\'xiaoming\', 0)
q.put(\'xiaohong\')
q.put(\'xiaofang\', 0)   # 队列大小为 2 ,当要放置第三个数据的时候,1会被阻塞,0会报错。默认参数为1

print(q.get())
print(q.get())
print(q.get())
print(q.get(0))   # 参数为 0 的时候如果队列空了,还去取值,就会报错。参数为 1 会被阻塞
View Code

 

以上是关于27 python 初学(信号量条件变量同步条件队列)的主要内容,如果未能解决你的问题,请参考以下文章

线程同步(互斥锁读写锁条件变量信号量)

[C++11 多线程同步] --- 条件变量的那些坑条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)

[C++11 多线程同步] --- 条件变量的那些坑条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)

[C++11 多线程同步] --- 条件变量的那些坑条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)

信号量互斥量同步变量条件变量和事件变量

python基础(21)-线程通信