将列表拆分为N个列表,并在多线程中将每个列表分配给工作程序

问题描述 投票:2回答:2

我正在编写一个从表中获取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()

先感谢您!

python multithreading list
2个回答
3
投票

两件事情:

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

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


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

© www.soinside.com 2019 - 2024. All rights reserved.