जब मेरी कतार खाली होती है, तो मानचित्र विधि वापस नहीं आती है।

स्क्रिप्ट को पूरा करने के लिए, मैं treahdpool.map_async या tasks.get(block=False) का उपयोग कर सकता था। लेकिन मैं समझना चाहता हूं कि जब यह कतार के साथ किया जाता है तो यह threadpool.map() को अनब्लॉक क्यों नहीं करता है।

from multiprocessing.dummy import Pool as ThreadPool
from queue import Queue

def threadworker(tasks):
    while True:
        # try:
        #     func, args, kargs = tasks.get(block=False)
        # except Empty:
        #     break
        func, args, kargs = tasks.get()
        try:
            func(*args, **kargs)
        except Exception as e:
            print(e)
        finally:
            tasks.task_done()


def wait_delay(d):
    print('sleeping for (%d)sec' % d)
    time.sleep(d)


if __name__ == '__main__':
    tasks = Queue()

    for d in range(1,5):
        tasks.put((wait_delay, (d,), {}))

    threadpool = ThreadPool(processes=2)
    # threadpool.map_async(threadworker, [tasks])
    threadpool.map(threadworker, [tasks]) # blocking...
    tasks.join()
0
trogne 21 सितंबर 2020, 21:16

1 उत्तर

सबसे बढ़िया उत्तर

Queue.get() अवरुद्ध कर रहा है यह बस वहीं बैठेगा और कुछ पाने के लिए प्रतीक्षा करेगा। टाइमआउट निर्दिष्ट करें और लूप को तोड़कर अपवाद को हैंडल करें।

from queue import Queue,Empty
def threadworker(tasks):
    while True:
        # try:
        #     func, args, kargs = tasks.get(block=False)
        # except Empty:
        #     break
        try:
            func, args, kargs = tasks.get(timeout=5)
        except Empty:
            break
        try:
            func(*args, **kargs)
        except Exception as e:
            print(e)
        finally:
            tasks.task_done()
0
wwii 21 सितंबर 2020, 18:41