将列表拆分为N个列表,并将每个列表分配给多线程

时间:2017-12-20 07:33:56

标签: python multithreading list

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

以前我只是在每个工作者定义中的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)在多线程中定义worker函数时,将不同的子列表传递给每个worker。注 - 在函数开头定义了worker(以及我想将查询结果拆分成的部分)。 但是,由于我对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()

提前谢谢!

2 个答案:

答案 0 :(得分:3)

两件事:

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

其次,除非你的工作人员涉及等待诸如IO,网络请求等事情,否则python中的线程并不比顺序处理更快(实际上可能更慢)。线程不使用多处理,一次只运行一个线程。如果这是你的情况,那么你可能想要Multiprocessing,它实际上会使一个全新的python进程工作。您已经在此处获得了queues等类似工具。

答案 1 :(得分:1)

如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