使用python

时间:2017-11-08 07:35:18

标签: python multithreading

我试图使用python中的线程将参数传递给列表中的函数 (注意:函数的值不应该是硬编码的,列表的所有元素都将被传递。) 请在此处查看示例代码:

from threading import Thread
list=['john','doe','srav','dev','app']
def m1(name,prefix):
    for ele in range(2):
        print(name +prefix)

def main1():
    t1=Thread(target=m1,args=('abcd','john'))
    t2 = Thread(target=m1, args=('abcd', 'doe'))
    t1.start()
    t2.start()

if __name__ == '__main__':
    main1()

这里我将值硬编码到函数('john','doe')而不是列表中的传递,所有元素都将被传递。

2 个答案:

答案 0 :(得分:1)

我不确定我是否完全明白你想要实现的目标。我的理解是你想为列表中的每个值启动一个单独的线程,因此每个值都会“并行”处理。我修改了main1函数来执行此操作:

def main1():
  threads = [Thread(target=m1,args=('abcd',x)) for x in list]
  for thread in threads: thread.start()
  for thread in threads: thread.join()

threads = [Thread(target=m1,args=('abcd',x)) for x in list]为列表中的每个值创建一个单独的线程。

for thread in threads: thread.start()启动每个帖子。

for thread in threads: thread.join()确保每个线程在从main1函数返回之前完成(如果你想立即返回,只需删除这一行)。

答案 1 :(得分:0)

您的任务非常适合与concurrent.futures模块一起使用。特别是,Executor.map将函数应用于可迭代的元素。

您可以使用与ThreadPoolExecutor中的docs示例类似的内容:

from concurrent.futures import ThreadPoolExecutor
from itertools import repeat

names = ['john', 'doe', 'srav', 'dev', 'app']
def m1(name, prefix):
    for _ in range(2):
        print(name + prefix)

with ThreadPoolExecutor(2) as executor:
    executor.map(m1, repeat('abcd', len(names)), names)

如果您发现repeat语法很尴尬,那么您有几种选择:

with ThreadPoolExecutor(2) as executor:
    for name in names:
        executor.submit(m1, 'abcd', name)

OR

with ThreadPoolExecutor(2) as executor:
    executor.map(lambda name: m1('abcd', name), names)

在所有情况下,with块都会隐式调用executor.shutdown,这将等待所有任务完成。

通常,不要调用变量list:它会影响内置类的名称。