将一个列表拆分成若干批,以多线程方式处理每批中的元素

1 人关注

我正在尝试将列表中的每个元素传递给一个函数,该函数在自己的线程上启动,做自己的工作。问题是如果列表中有100多个元素,它将在100个线程上启动100个函数()。

为了我的电脑,我想按以下步骤分批处理这个名单,每批10个。

  • Batch 1 gets queued.
  • Pass each element from batch1 to the function getting started on its own thread (This way I will only have 10 function threads running at a time)
  • Once all 10 threads have finished, they get popped off from their queue
  • Repeat until all batches are done
  • 我试图使用两个列表,前10个元素被弹出到列表2。处理list2,一旦线程完成,再弹出10个元素,直到list1达到0的长度。

    我已经走到了这一步,不知道该如何继续。

        carsdotcomOptionVal, carsdotcomOptionMakes = getMakes()
        second_list = []
        threads = []
        while len(carsdotcomOptionVal) != 0:
            second_list.append(carsdotcomOptionVal.pop(10))
            for makesOptions in second_list:
                th = threading.Thread(target=getModels, args=[makesOptions])
                th.start()
                threads.append(th)
            for thread in threads:
                thread.join()
    

    最后,主列表中的元素不一定是偶数,因为它们可以是奇数。

    python
    multithreading
    MemeLord
    MemeLord
    发布于 2019-09-15
    1 个回答
    Ofer Sadan
    Ofer Sadan
    发布于 2019-09-15
    已采纳
    0 人赞同

    你应该使用一个 queue.Queue 对象,它可以为其他 "工作者线程 "创建一个线程安全的任务列表。你可以选择有多少个工人线程处于活动状态,它们将各自从列表中获取信息,直到完成。

    下面是一个带有 queue 的示例代码的样子。

    import queue
    import threading
    threads_to_start = 10 # or choose how many you want
    my_queue = queue.Queue()
    def worker():
        while not my_queue.empty():
            data = my_queue.get()
            do_something_with_data(data)
            my_queue.task_done()
    for i in range(100):
        my_queue.put(i) # replace "i" with whatever data you want for the threads to process
    for i in range(threads_to_start):
        t = threading.Thread(target=worker, daemon=True) # daemon means that all threads will exit when the main thread exits
        t.start()
    my_queue.join() # this will block the main thread from exiting until the queue is empty and all data has been processed