我正在编写一个从表中获取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()
提前谢谢!
答案 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。