簡體   English   中英

python多線程/多進程代碼

[英]python multi threading/ multiprocess code

在下面的代碼中,我正在考慮使用多線程或多進程從url進行獲取。 我認為游泳池將是理想的選擇,任何人都可以幫忙提出解決方案。

想法:匯集線程/進程,收集數據...我的首選是進程而不是線程,但不確定。

import urllib

URL = "http://download.finance.yahoo.com/d/quotes.csv?s=%s&f=sl1t1v&e=.csv"
symbols = ('GGP', 'JPM', 'AIG', 'AMZN','GGP', 'JPM', 'AIG', 'AMZN')
#symbols = ('GGP')

def fetch_quote(symbols):
    url = URL % '+'.join(symbols)
    fp = urllib.urlopen(url)
    try:
        data = fp.read()
    finally:
        fp.close()
    return data

def main():
    data_fp = fetch_quote(symbols)
#    print data_fp
if __name__ =='__main__':
    main()

因此,這是一個非常簡單的示例。 遍歷每次傳遞一個到fetch_quote的符號。

import urllib
import multiprocessing

URL = "http://download.finance.yahoo.com/d/quotes.csv?s=%s&f=sl1t1v&e=.csv"
symbols = ('GGP', 'JPM', 'AIG', 'AMZN','GGP', 'JPM', 'AIG', 'AMZN')
#symbols = ('GGP')

def fetch_quote(symbol):
    url = URL % '+'.join(symbol)
    fp = urllib.urlopen(url)
    try:
        data = fp.read()
    finally:
        fp.close()
    return data


def main():

    PROCESSES = 4
    print 'Creating pool with %d processes\n' % PROCESSES
    pool = multiprocessing.Pool(PROCESSES)
    print 'pool = %s' % pool
    print

    results = [pool.apply_async(fetch_quote, sym) for sym in symbols]

    print 'Ordered results using pool.apply_async():'
    for r in results:
        print '\t', r.get()

    pool.close()
    pool.join()

if __name__ =='__main__':
    main()

您有一個同時請求多個信息的過程。 讓我們嘗試一次獲取這些信息。您的代碼將是:

def fetch_quote(symbols):
    url = URL % '+'.join(symbols)
    fp = urllib.urlopen(url)
    try:
        data = fp.read()
    finally:
        fp.close()
    return data

def main():
    for symbol in symbols:
        data_fp = fetch_quote((symbol,))
        print data_fp

if __name__ == "__main__":
    main()

所以main()調用,每個網址一個接一個地獲取數據。 讓我們用一個池對其進行多處理:

import urllib
from multiprocessing import Pool

URL = "http://download.finance.yahoo.com/d/quotes.csv?s=%s&f=sl1t1v&e=.csv"
symbols = ('GGP', 'JPM', 'AIG', 'AMZN','GGP', 'JPM', 'AIG', 'AMZN')

def fetch_quote(symbols):
    url = URL % '+'.join(symbols)
    fp = urllib.urlopen(url)
    try:
        data = fp.read()
    finally:
        fp.close()
    return data

def main():
    for symbol in symbols:
        data_fp = fetch_quote((symbol,))
        print data_fp

if __name__ =='__main__':
    pool = Pool(processes=5)
    for symbol in symbols:
        result = pool.apply_async(fetch_quote, [(symbol,)])
        print result.get(timeout=1)

在以下主要內容中,創建了一個新過程來請求每個符號url。

注意:在python上,由於存在GIL,因此必須將多線程視為錯誤解決方案。

有關文檔,請參見: python中的多處理

實際上,有可能兩者都不做。 您可以使用異步調用在一個線程中完成它,例如Twisted Web中的 twisted.web.client.getPage

如您所知,由於GIL,Python中的多線程實際上並不是多線程。 本質上,它是在給定時間運行的單個線程。 因此,在您的程序中,如果您希望在任何給定時間獲取多個URL,那么多線程可能不是解決之道。 還在爬網之后將數據存儲在單個文件或一些持久數據庫中嗎? 這里的決定可能會影響您的表現。

這樣,多進程效率更高,但是會產生額外進程的時間和內存開銷。 我最近在Python中探索了這兩個選項。 這是網址(帶有代碼)-

python->多處理模塊

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM