【问题标题】:Split list into N lists, and assign each list to a worker in multithreading将列表拆分为 N 个列表,并将每个列表分配给多线程中的工作人员
【发布时间】:2018-06-02 17:05:10
【问题描述】:

我正在编写一个脚本,从表中获取 N 条记录,并通过多线程处理所述记录。

之前我只是在每个worker定义的SQL语句中使用了Order by RAND(),并希望不会有重复。

这种工作(重复数据删除稍后完成),但是,我想通过以下方式使我的脚本更高效:

1)查询表一次,提取N条记录,分配给一个列表

2) 将大列表拆分为约等大小的 Y 个列表,可以通过以下方式完成:

number_of_workers = 2
first_names = ['Steve', 'Jane', 'Sara', 'Mary','Jack']
def chunkify(lst,n):
     return [lst[i::n] for i in xrange(n)]
list1 = chunkify(first_names, number_of_workers)
print list1

3) 在多线程中定义工作者函数时,将不同的子列表传递给每个工作者。注意 - 工作人员的数量(以及我想将查询结果拆分成的部分)在函数的开头定义。 但是,由于我对 Python 还很陌生,我不知道如何将每个子列表传递给单独的工作人员(或者它甚至可行吗?)
任何帮助、其他建议等将不胜感激!

多线程代码示例如下。我将如何使用

import threading
import random

def worker():

    assign sublistN to worker N 
    print sublistN

threads = []
for i in range(number_of_workers):
    print i
    print ""
    t = threading.Thread(target=worker)
    threads.append(t)
    t.start()

提前谢谢你!

【问题讨论】:

    标签: python multithreading list


    【解决方案1】:

    两件事:

    首先,看一下Queue 对象。您甚至不需要以这种方式自己拆分列表。它用于在多个线程之间拆分对象集合(还有一个多进程变体,这就是我要去的地方)。这些文档包含非常适合您要求的示例。

    其次,除非您的工作人员涉及等待诸如 IO、网络请求等的事情。python 中的线程并不比顺序处理更快(实际上可能更慢)。线程不使用多处理,一次只运行一个线程。如果这是您的情况,您可能需要Multiprocessing,它实际上启动了一个全新的python 进程来工作。您在这里有类似的工具,例如queues

    【讨论】:

    • 感谢您的信息。将查看队列。至于线程 - 我正在构建一个抓取脚本,瓶颈是通过代理的网络/请求,因此线程似乎确实加快了处理速度,直到单个 cpu 核心达到顶峰。我确实读过关于多处理的好东西,但我无法让它工作,我的猜测是因为我通过 jupyter notebook 运行代码。一旦我变得更好,我肯定会再次尝试多处理,并希望利用所有这些核心:)
    【解决方案2】:

    正如 SCB 所说,这是通过使用 que 解决的。 这是一个快速示例,它采用名称列表 -> 将名称传递给每个工人(2 个工人) -> 每个工人简单地打印他们被赋予的名称。

    from Queue import Queue
    from threading import Thread
    from time import sleep
    first_names = ['Steve', 'Jane', 'Sara', 'Mary','Jack','tara','bobby']
    
    
    q = Queue(first_names)
    num_threads = 2
    
    def do_stuff(q):
        while True:
            print q.get()
            sleep(1)
            q.task_done()
    
    
    
    for i in range(num_threads):
        worker = Thread(target=do_stuff, args=(q,))
        worker.start()
    
    for x in first_names:
        q.put(x)
    
    q.join()
    

    代码改编自here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-25
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-29
      相关资源
      最近更新 更多