2
# 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 个线程吗?这段代码可以做哪些修改?

4

2 回答 2

4

很少需要创建如此多的 Python 线程。更重要的是,我很难想象其中的原因。有合适的架构模式来解决创建并行执行代码的任务,这些任务限制了线程的数量。其中之一是反应堆

你想做什么?

请记住,由于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可能真的有帮助。

于 2013-02-03T07:55:15.550 回答
0

这是一个示例,它将通过ThreadPoolExecutor使用 32 个线程来计算任意长度列表的平方。正如 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)
于 2013-02-03T08:04:22.997 回答