生産者 - 消費者モデルの同期キュー

マルチスレッド

同期オブジェクト

この問題を解決しますか?

実行するために他のスレッドに移動し、実行前のスレッドを指定したいです

エッセンス次のように

#event = threading.Event()
# event.isSet():返回event的状态值;
#
# event.wait():如果 event.isSet()==False将阻塞线程;
#
# event.set(): 设置event的状态值为True,所有阻塞池的线程激活进入就绪状态, 等待操作系统调度;
#
# event.clear():恢复event的状态值为False。
import threading
import time

ll=[]

class Boss(threading.Thread):
    def run(self):
        print("老板说今天23:00下班")
        print(event.is_set())
        time.sleep(1)
        event.set()
        time.sleep(6)
        print("老板说时间到了下班")
        event.set()

class Worker(threading.Thread):
    def run(self):
        event.wait()
        print("员工说:不要加班啊!!")
        event.clear()
        event.wait()
        print("员工说:下班下班!")

if __name__ == '__main__':
    event = threading.Event()
    boss=Boss()
    ll.append(boss)
    for i in range(5):
        i=Worker()
        ll.append(i)
    for z in ll:
        z.start()

セマフォ

ロックと等価では複数のスレッドを同期することができます

出力プリント5つのスレッド:出力

import threading
import time

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

if __name__ == '__main__':
    thr=[]
    semaphore=threading.Semaphore(5)
    for i in range(100):
        i=zx()
        i.start()

スレッド1
スレッド4
スレッド2
、スレッド3
スレッド5
スレッド-6-
スレッド9
スレッド-7
スレッド8
スレッド10

....

キューキュー

リストはスレッドセーフではありません

キューは、スレッドセーフであります

これは、複数のスレッドが問題なくデータにアクセスすることができます

キューにアクセスするには、3つの方法があります。

1.先入れ先出し

2.最後のアウト

3.優先順位

import queue

q=queue.Queue()
q.put("sad")
q.put("123")
q.put("sady7854")

while 1:
    print(q.get())

悲しい
123
sady7854

データが挿入されると、キューがいっぱいである、彼はデフォルトを与えられていない、堆積物中に出て待っています、あなたはエラーを設定することができます

データがないときにデータを取ったとき、彼は、預金を待ち、その後、デフォルトではエラーではありませんが削除されます

プロデューサーの消費者モデル(キュー)

たとえば、次のように棚にパンアウトの生産は、顧客が来て、彼らが買いました。棚同等のキュー

コードは、簡単な例を実装して理解するために、完璧ではありません

import queue
import threading
import random
import time

def producer(name):
    while 1:
        print(f"{name}正在制作包子")
        t=random.randint(1,4)
        time.sleep(t)
        bao_zi_que.put("包子")
        print("新出炉的包子哟!")
        bao_zi_que.task_done()#通知join有内容了,不用等待了
        time.sleep(0.5)

def customer(name):
    while 1:
        print(f"{name}在等待包子")
        bao_zi_que.join()
        bao_zi_que.get()
        time.sleep(1)
        print(f"{name}吃掉了包子")

bao_zi_que=queue.Queue()

if __name__ == '__main__':
    print("欢迎来到源氏百年包子店")
    A=threading.Thread(target=producer,args=("包子老板",))
    B=threading.Thread(target=customer,args=("zx",))
    C=threading.Thread(target=customer,args=("wl",))
    D=threading.Thread(target=customer,args=("125",))
    A.start()
    B.start()
    C.start()
    D.start()

源氏世紀のパン屋へようこそ
パンのボスは饅頭作っている
ZX待っパンは
パン待っWL
125待っパン
焼きたてのパンのよ!
ボスはバンズバンズの作っている
ZX食べ饅頭
パンを待っZXを
焼きたてのパンよ!
ボスはバンズバンズが作って
食べ饅頭WL
パン待っWL
たてのパンのヨーヨーを焼きを!
蒸しパンのボスが作って
食べた125個のまんじゅう
125個の待っパン
焼きたてのパンのよ!
ボスはバンズバンズの作っている
ZX食べ饅頭
パンを待っZXを
焼きたてのパンよ!
ボスはバンズバンズが作って
食べ饅頭WL
パン待っWL
たてのパンのヨーヨーを焼きを!
ボスは、パンのパンを作っています

おすすめ

転載: www.cnblogs.com/zx125/p/11443719.html