bugfix> python-2.7 > 投稿

私は2つのプロセスを作成しました。1つのプロセスがマルチスレッドを生成し、キューへのデータ書き込みに対する応答と、キューからのデータ読み取りを行います。頻繁にデッドブロックしますが、そうではありません。特に、書き込みモジュールのrunメソッドにsleepを追加する場合(コードのコメント)。以下に私のコードを入れてみましょう。

環境: python2.7

main.py

   from multiprocessing import Process,Queue
    from write import write
    from read import read
    if __name__ == "__main__":
        record_queue = Queue()
        table_queue = Queue()
        pw = Process(target=write,args=[record_queue, table_queue])
        pr = Process(target=read,args=[record_queue, table_queue])
        pw.start()
        pr.start()
        pw.join()
        pr.join()

write.py

from concurrent.futures import ThreadPoolExecutor, as_completed
def write(record_queue, table_queue):
    thread_num = 3
    pool = ThreadPoolExecutor(thread_num)
    futures = [pool.submit(run, record_queue, table_queue) for _ in range (thread_num)]
    results = [r.result() for r in as_completed(futures)]

def run(record_queue, table_queue):
    while True:
        if  table_queue.empty():
            break
    table = table_queue.get()
    # adding this code below reduce deadlock opportunity.
    #import time
    #import random
    #time.sleep(random.randint(1, 3))
    process_with_table(record_queue, table_queue, table)
def process_with_table(record_queue, table_queue, table):
    #for short
    for item in [x for x in range(1000)]:
        record_queue.put(item)

read.py

from concurrent.futures import ThreadPoolExecutor, as_completed
import threading
import Queue
def read(record_queue, table_queue):
    count = 0
    while True:
        item = record_queue.get()
        count += 1
        print ("item: ", item)
        if count == 4:
            break

私はそれをグーグルで検索しましたが、SOにも同じ質問がありますが、私のコードと比較して類似性を見ることができないので、誰でも私のコードを助けることができます、ありがとう...

回答 1 件
  • 私は解決策を見つけているようで、書き込みモジュールの実行方法を次のように変更します:

    def run(record_queue, table_queue):
        while True:
            try:  
                 if table_queue.empty():
                     break
                 table = table_queue.get(timeout=3)
                 process_with_table(record_queue, table_queue, table)
            except multiprocessing.queues.Empty:
                 import time
                 time.sleep(0.1)
    
    

    getメソッドでデッドロックやブロッキングが発生することはありません。

あなたの答え