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

2024-10-01 11:26:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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

以前我只是在每个worker定义中的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相当陌生,我不知道如何将每个子列表传递给一个单独的worker(或者它是否可行?)
任何帮助,其他建议等都将不胜感激!在

下面是多线程代码的示例。我该如何使用

^{pr2}$

提前谢谢你!在


Tags: of函数脚本number列表定义names方式
2条回答

两件事:

首先,看一下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。在

相关问题 更多 >