python多线程产生并发线程

时间:2018-05-18 13:34:43

标签: python python-3.x python-3.5 python-multiprocessing python-multithreading

我是python线程的新手,我已经尝试了下面的代码来理解线程。

import threading

def sq(num):
    for n in num:
        print("calculating square")
        print('square={}'.format(n*n))

numbers=[10,20,30,40,50,60]

t1 = threading.Thread(target=sq, args=(numbers,))

t1.start()
t1.join()

据我所知,上面的代码发出了一个线程来计算数字的平方。

我想知道是否有可能产生n个不同的线程来计算n个数字的平方?例如,如果我在数字数组中有五个数字为[10,20,30,40,50]。而不是发出一个单独的线程,可以发出5个并发线程,其中每个线程计算一个数字的sq。

我已经尝试过以下代码来执行此操作,但我不确定它是否已发出n个并发线程(其中n = len(数字))。基本思路是同时发出n个不同的线程,其中每个线程计算数字数组中一个元素的平方,第一个线程应该计算数字数组中第一个元素的sq,同样第五个线程应该计算数字中第五个元素的sq数组等等。

最简单的想法是添加n个threading.Thread语句并发布线程,但还有其他方法可以使它更简单。

最好的问候。

import threading

def sq(num):
    print("calculating square")
    print('square={}'.format(num*num))

numbers=[10,20,30,40,50,60]

for i in range(0,len(numbers)):
    t1 = threading.Thread(target=sq, args=(numbers[i],))
    t1.start()
    t1.join()

2 个答案:

答案 0 :(得分:1)

您可以利用线程池。

import multiprocessing as mp

from multiprocessing.dummy import Pool as ThreadPool

def sq(num):
    return num * num


with ThreadPool(mp.cpu_count()) as pool:
    results = pool.map(sq, [10,20,30,40,50,60])

    print(results)

multiprocessing.dummy复制用于多线程的API。上面的代码生成了一系列等于您的CPU核心数的线程,然后在数组中的每个元素上调用sq

Documentation for multiprocessing.dummy

编辑。我只是注意到了这个问题的年龄,但是我会继续回答。

答案 1 :(得分:0)

你应该能够。但是您的示例将在每次迭代中覆盖t1。在开始所有线程之前,也不要join()线程。

伪解决方案:

threads = []
for number in numbers:
    new_thread = threading.Thread(target=sq, args=(number,))
    threads.append(new_thread)
    new_thread.start()
for old_thread in threads:
    old_thread.join()