在下面的代码中,我正在考虑使用多线程或多进程从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()
答案 0 :(得分:1)
所以这是一个非常简单的例子。它迭代遍历一次一个的符号到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()
答案 1 :(得分:1)
您有一个请求,一次请求多个信息的流程。让我们尝试逐个获取这些信息。您的代码将是:
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()调用,每个url逐个获取数据。 让我们用池进行多处理:
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存在,多线程必须被认为是一种错误的解决方案。
有关文档,请参阅:Multiprocessing in python
答案 2 :(得分:0)
实际上,没有两者都可以做到。您可以使用异步调用在一个线程中完成它,例如来自 Twisted Web 的twisted.web.client.getPage
。
答案 3 :(得分:-1)
正如您所知,由于GIL,Python中的多线程实际上并不是多线程。基本上它是在给定时间运行的单个线程。因此,在您的程序中,如果您希望在任何给定时间获取多个URL,则多线程可能不是最佳选择。在爬网之后,您还将数据存储在单个文件或某个持久性数据库中?这里的决定可能会影响您的表现。
多进程在这方面更有效但是有时间&额外进程产生的内存开销。我最近在Python中探索了这两个选项。这是网址(带代码) -