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

Fly*_*ra1 5 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
Run Code Online (Sandbox Code Playgroud)

3)在多线程中定义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()
Run Code Online (Sandbox Code Playgroud)

先感谢您!

SCB*_*SCB 4

两件事情:

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

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