关于多线程:使用Python-3.x中的最大CPU功率进行多处理

Multiprocessing using maximum CPU power in Python-3.x

我正在研究由3.2亿个字符组成的人类基因组,我有一个需要在这些数据中搜索的对象列表。 像这样的东西:

1
2
3
4
5
6
7
8
9
10
result_final=[]
objects=['obj1','obj2','obj3',...]

def function(obj):
    result_1=search_in_genome(obj)
    return(result_1)

for item in objects:
    result_2=function(item)
    result_final.append(result_2)

每个对象在数据中的搜索花费将近30秒,并且我有几千个对象。 我注意到,在连续执行此操作时,只使用了7%的CPU和5%的RAM。 当我搜索时,为了减少计算时间,我应该使用排队,线程或多处理进行并行计算。 但对于非专家来说,它们似乎很复杂。 任何人都可以帮助我如何编写python代码来运行10个同时搜索,是否可以让python使用最大可用CPU和RAM进行多处理? (我在Windows 7上使用带有64Gb RAM,COREI7和3.5 GH CPU的Python33)


您可以使用multiprocessing模块:

1
2
3
4
5
6
7
8
9
10
11
12
from multiprocessing import Pool

objects=['obj1','obj2','obj3',...]

def function(obj):
    result_1=search_in_genome(obj)
    return(result)


if __name__ =="__main__":
    pool = Pool()
    result_final = pool.map(function, objects)

这将允许您在计算机上的所有可用CPU上扩展工作,因为进程不受GIL的影响。 您不希望运行比可用CPU更多的任务。 一旦你这样做,你实际上开始放慢速度,因为那时CPU必须不断地在进程之间切换,这会降低性能。


好的我不确定你的问题,但我会这样做(请注意,可能有一个更好的解决方案,因为我不是队列对象的专家):

如果您想多线程搜索:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class myThread (threading.Thread):

    def __init__(self, obj):

        threading.Thread.__init__(self)

        self.result = None

        self.obj = obj

    #Function who is called when you start your Thread
    def run(self)

        #Execute your function here
        self.result = search_in_genome(self.obj)




if __name__ == '__main__':

    result_final=[]
    objects=['obj1','obj2','obj3',...]

    #List of Thread
    listThread = []

    #Count number of potential thread
    allThread = objects.len()
    allThreadDone = 0

    for item in objects:

        #Create one thread
        thread = myThread(item)

        #Launch that Thread
        thread.start()

        #Stock it into the list
        listThread.append(thread)


    while True:

        for thread in listThread:

            #Count number of Thread who are finished
            if thread.result != None:

                #If a Thread is finished, count it
                allThreadDone += 1

        #If all thread are finished, then stop program
        if allThreadDone == allThread:
            break
        #Else initialyse flag to count again
        else:
            allThreadDone = 0

如果有人可以检查并验证更好的代码。 (抱歉我的英文顺便说一句)