使用for循环和多线程python

时间:2016-02-22 14:42:08

标签: python multithreading

I have a parent script that runs 10 child scripts.这些脚本除了'name'之外是相同的,每个脚本调用不同的api,保存到依赖于名称的不同文件夹等。

我最初只是将脚本复制了10次但是我现在意识到这很荒谬,好像我进行了一次升级,我必须对所有人进行10次升级。

我对线程很新,我不确定是否允许这样做,但是我可以设置一个调用脚本的for循环或者类似的东西并将'name'放在里面:

#parent.py
from threading import Thread
import sys
names =  ['BTC', 'BTS', 'ETH', 'CLAM', 'DOGE', 'FCT', 'MAID', 'STR', 'XMR', 'XRP' ]

for name in names: 
    sys.path.append('/python/loanrates/'+name)
    import name
    Thread(target=name.main(name)).start()
    Thread(target=name.main(name)).join()

2 个答案:

答案 0 :(得分:1)

首先,您应该考虑使用multiprocessing module,因为threading在Python中具有误导性(在某种意义上,Python目前是单线程的)。

使用这个模块,可以很容易地“推动循环”到模块上。

首先,定义一个池:

# start 4 worker processes
pool = Pool(processes=4)         

现在,如果你有一个名字运行的函数f,你可以使用

pool.map(f, names)     

仅当f应用于names中的每个项目时,才会返回此选项,使用4个进程的Pool(在本例中)。即,它就像一个“神奇的”并行循环

"parallel for" name in names:
    f(name)

答案 1 :(得分:1)

您可以拥有threads列表,在循环中启动它们,然后等待它们加入另一个for循环:

from threading import Thread
import sys
names =  ['BTC', 'BTS', 'ETH', 'CLAM', 'DOGE', 'FCT', 'MAID', 'STR', 'XMR', 'XRP' ]
threads = []
for name in names: 
    sys.path.append('/python/loanrates/'+name)
    import name
    T = Thread(target=name.main(name))
    threads.append(T)

for thread_ in threads:
    thread_.start()

for thread_in threads:
    thread_.join()