# 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个线程? 可以在此代码中进行哪些修改?
答案 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)