繁体   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