У вас есть процесс, который запрашивает несколько данных одновременно. Давайте попробуем получить эту информацию одну за другой .. Ваш код будет:
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