Python处理大量线程?

时间:2013-02-03 07:08:54

标签: python multithreading parallel-processing python-stackless

# data is a list  

Threading_list=[]

class myfunction(threading.Thread):

    def __init__(self,val):
        .......
    .......

     def run(self):
        .......
        ....... 

for i in range(100000):

    t=myfunction(data[i]) # need to execute this function on every datapoint 
    t.start()
    Threading_list.append(t)

for t in Threading_list:
    t.join()

这将创建大约100000个线程,但我可以创建最多32个线程? 可以在此代码中进行哪些修改?

2 个答案:

答案 0 :(得分:4)

很少需要创建很多Python线程。更重要的是,我几乎无法想象这样做的原因。有合适的架构模式来解决创建并行执行的代码的任务,这限制了线程的数量。其中一个是reactor

你想做什么?

并且记得,由于GIL,Python线程不会为计算任务提供任何性能提升,即使在多处理器和多内核系统上也是如此(顺便说一下,是否有100000内核系统?我怀疑。 ))。增强的唯一机会是,计算部分是在用C / C ++编写的模块内执行的,这些模块在不获取GIL的情况下完成工作。通常,Python线程用于并行执行包含阻塞I / O操作的代码。

UPD:注意到stackless-python标签。 AFAIK,它支持微线程。但是,目前还不清楚你想做什么。

如果你只想处理100000个值(对每个值应用一个公式?),最好写一些类似的东西:

def myfunction(val):
    ....
    return something_calculated_from_val

results = [myfunction(d) for d in data] # you may use "map(myfunction, data)" instead

除非myfunction()执行一些阻塞I / O,否则应该会好得多。如果确实如此,ThreadPoolExecutor可能会有所帮助。

答案 1 :(得分:0)

这是一个使用32个线程通过ThreadPoolExecutor计算任意长度列表的方块的示例。正如Ellioh所说,在某些情况下您可能不想使用线程,因此您可以轻松切换到ProcessPoolExecutor

import concurrent.futures

def my_function(x):
    return 2**x

data = [1, 6, 9, 3, 8, 4, 213, 534]

with concurrent.futures.ThreadPoolExecutor(max_workers=32) as executor:
    result = list(executor.map(my_function, data))

print(result)