我试图使用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')而不是列表中的传递,所有元素都将被传递。
答案 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
:它会影响内置类的名称。