我正在编写一个从表中获取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()
先感谢您!
两件事情:
首先,看看Queue对象。您甚至不需要以这种方式将列表分开。它用于在多个线程之间拆分对象集合(还有一个多进程变量,这是我要去的地方)。文档包含符合您要求的非常好的示例。
其次,除非你的工作人员涉及等待诸如IO,网络请求等事情,否则python中的线程并不比顺序处理更快(实际上可能更慢)。线程不使用多处理,一次只运行一个线程。如果这是你的情况,你可能会想要Multiprocessing实际上旋转一个全新的python进程来工作。你有类似的工具,比如queues。
如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。