Python - 在线程脚本中迭代列表

时间:2011-01-31 22:25:44

标签: python multithreading

我正在尝试编写一个线程Python脚本,它将遍历一个url列表,并在一个单独的线程中打开每个脚本。

from BeautifulSoup import BeautifulSoup
from threading import Thread
import mechanize

tickers = ["aapl", "siri", "goog", "intc"]
nextTicker = 0

def quotes(i):
    br = mechanize.Browser()
    br.addheaders = [('User-agent', 'Mozilla/5.0 (Windows; U; Windows NT   6.1; en-US; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10')]
    r= br.open('http://finance.yahoo.com/q?s=' + tickers[nextTicker])
    html = r.read()
    soup = BeautifulSoup(html)
    price = soup.findAll('span', attrs={"id":"yfs_l10_" + tickers[nextTicker]})
    price = price[0].string
    print price

for i in range(4):
    t = Thread(target=quotes, args=(i,))
    t.start()

我知道我需要一个nextTicker = nextTicker + 1,以便每个帖子都会从名为tickers的列表中获取一个唯一的自动收报机符号,但我不知道在哪里放这个或如何确保每个帖子都得到一个独特的网址。

现在,当脚本运行时,它只是从列表中获取所有四个线程的索引0项。如何让每个线程获取列表中的下一个项目并将其附加到我的基本URL?

2 个答案:

答案 0 :(得分:3)

如果您需要特定于线程的数据,请将其传递给参数。

所以使用代码[i]代替代码[nextTicker]

更好的是,使用

for ticker in tickers:
   t = Thread(target = quotes, args = (ticker,) )

可能更好,结帐eventlet。它允许编写这样的代码,但避免了线程的一些问题。

答案 1 :(得分:2)

只需参考nextTicker,而不是插入tickers[i]变量并且必须锁定它等等。 (或者甚至更好,只需通过自动收报机!)