2011-01-31 3 views
0

URL 목록을 반복하고 개별 스레드에서 각각 열리는 스레드 된 Python 스크립트를 작성하려고합니다.Python - 스레드 된 스크립트에서 목록을 반복합니다.

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이 필요하다는 것을 알고 있지만 나는이를 넣어 위치를 잘 모르겠습니다 각 스레드가를 받고 있는지 확인하는 방법 고유 URL.

지금은 스크립트가 실행될 때 4 개의 모든 스레드에 대한 목록의 인덱스 0 항목 만 가져옵니다. 각 스레드가 목록의 다음 항목을 잡고 기본 URL에 추가하도록하려면 어떻게합니까?

답변

3

스레드 특정 데이터를 원하면 인수에 전달하십시오.

그래서

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

아마도 더 나은 아직, 체크 아웃 eventlet를 사용하여 더 나은 아직 시세 [i]를 대신 시세

[nextTicker]

를 사용합니다. 그것은 이와 같은 코드를 작성할 수는 있지만 쓰레드의 문제는 피할 수 있습니다.

+0

감사의 말에 감사드립니다. 나는 그것을 체크하고 그것을 가지고 새로운 스크립트를 만들었다. –

2

nextTicker 변수에 간섭하고이를 잠그지 않고 그냥 tickers[i]을 참조하십시오. (또는 더 나은 것은 단지 시세표 자체를 전달하십시오!)

관련 문제