ฉันมีสองเธรด A และ B วิธีแก้ปัญหาที่ฉันต้องการบรรลุคือ เธรด A ควรใช้กิจกรรมบางอย่างจากนายหน้าอย่างไม่รู้จบ เธรด B ต้องเปิดใช้งานก็ต่อเมื่อมีข้อความจำนวนหนึ่งที่ใช้ไปเท่านั้น สมมติว่า 10 เธรด A ต้องเรียกใช้ข้อความที่สิ้นเปลืองอย่างไม่สิ้นสุดและเธรด B ต้องเปิดใช้งานเมื่อเธรด A ได้รับ 10 ข้อความและดำเนินการและตายแล้วเริ่มใหม่อีกครั้งเมื่อ มีข้อความ 10 ชุดถัดไปเข้ามา วิธีที่ฉันพยายามทำงานนี้คือ:

def threadA():
    #an action

def threadB():
    #an action

readThread.start()
sleep(10)
emailThread.start()

readThread.join()
emailThread.join()

ด้วยวิธีนี้ เธรดจะสิ้นสุดเมื่อการวนรอบเดียวสิ้นสุดลง และฉันไม่ได้เพิ่มตรรกะในการเริ่มเธรด B หลังจากได้รับข้อความ 10 ข้อความ ซึ่งเป็นส่วนที่ฉันไม่สามารถบรรลุได้

ตอบ

while True:จะต้องอยู่ภายในเธรดเพื่อใช้งานอย่างไม่รู้จบ และเพื่อที่จะรัน B เมื่อเธรด A ถูกดำเนินการ 10 ครั้ง ต้องใช้คิวหรือ deque ที่สามารถแลกเปลี่ยนข้อมูลระหว่างเธรดได้ (ไม่แนะนำให้ใช้ตัวแปรโกลบอล และแนะนำให้ใช้ deque มากกว่าคิว ) สุดท้าย เธรดสามารถเริ่มได้เพียงครั้งเดียว ดังนั้นจึงควรทำงานต่อไป เว้นแต่คุณจะประกาศเธรดใหม่ ดังนั้น threadB จึงใส่while True:. (แนะนำให้ใช้daemon=Trueกับเธรดที่ทำงานไม่รู้จบwhile True:เพื่อลดการสูญเสียหน่วยความจำ)

import threading
from collections import deque

def threadA(dqu):
    count = 0
    while True:
        if count == 10:
            dqu.append('do B')
            count = 0
        #an action
        count += 1

def threadB(dqu):
    while True:
        if dqu:
            msg = dqu.popleft()
            if msg == 'do B':
                #an action

dequeAB = deque()
readThread = threading.Thread(target=threadA, args=(dequeAB,), daemon=True)
emailThread = threading.Thread(target=threadB, args=(dequeAB,), daemon=True)
readThread.start()
emailThread.start()
while True:
    pass