python多线程/多进程代码

python多线程/多进程代码,python,multithreading,multiprocess,Python,Multithreading,Multiprocess,在下面的代码中,我考虑使用多线程或多进程从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', 'AMZ

在下面的代码中,我考虑使用多线程或多进程从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()

事实上,没有这两个都可以做到。您可以使用异步调用在一个线程中完成,例如
twisted.web.client.getPage
fromweb

事实上,两者都不存在也可以做到。您可以使用异步调用在一个线程中完成,例如
twisted.web.client.getPage
fromweb

正如您所知,由于GIL,Python中的多线程实际上不是多线程。本质上,它是在给定时间运行的单个线程。因此,在您的程序中,如果您希望在任何给定时间获取多个URL,多线程可能不是一种可行的方法。在爬网之后,您是否将数据存储在单个文件或某个持久数据库中?这里的决定可能会影响你的表现

多进程的效率更高,但会产生额外进程的时间和内存开销。最近,我在Python中探讨了这两个选项。这是url(带代码)-


正如您所知,由于GIL,Python中的多线程实际上不是多线程。本质上,它是在给定时间运行的单个线程。因此,在您的程序中,如果您希望在任何给定时间获取多个URL,多线程可能不是一种可行的方法。在爬网之后,您是否将数据存储在单个文件或某个持久数据库中?这里的决定可能会影响你的表现

多进程的效率更高,但会产生额外进程的时间和内存开销。最近,我在Python中探讨了这两个选项。这是url(带代码)-


下面是一个非常简单的例子。它对每次传递一个的符号进行迭代以获取引用

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()

这里有一个非常简单的例子。它对每次传递一个的符号进行迭代以获取引用

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()调用,一个接一个地调用每个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)
在下面的main中,将创建一个新进程来请求每个符号的URL

注意:在python上,由于存在GIL,因此必须将多线程视为错误的解决方案


有关文档,请参阅:

您有一个流程,可以同时请求多个信息。让我们试着一个接一个地获取这些信息。。您的代码将是:

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)
在下面的main中,将创建一个新进程来请求每个符号的URL

注意:在python上,由于存在GIL,因此必须将多线程视为错误的解决方案



有关文档,请参阅:

您是否还想同时执行其他操作?您的代码只执行一个请求。不,现在,我正在学习python,所以试图让一切都保持简单。谢谢,我已经看过这个过程的方法了,有人能给我演示一下线程的方法吗。求你了,谢谢。你还想同时做些什么吗?您的代码只执行一个请求。不,现在,我正在学习python,所以试图让一切都保持简单。谢谢,我已经看过这个过程的方法了,有人能给我演示一下线程的方法吗。请,谢谢。@vartec无需购买任何第三方额外软件包。Python2.6+以后的版本有很好的内置包用于这种用途。哦,有人提到Twisted,这意味着所有其他答案都会被否决@movieyoda:嗯,出于显而易见的原因(GAE,Jython),我喜欢与2.5兼容。无论如何,也许我遗漏了一些东西,Python 2.6引入了什么对异步web调用的支持?@Nick:不幸的是,由于GIL,Python在线程方面很糟糕(我知道,函数调用是在GIL发布的情况下完成的),所以使用线程而不是延迟异步调用不会带来任何好处。另一方面,事件驱动编程规则即使在实际可以使用线程的情况下(参见:ngnix,lighttpd),显然在Python(Twisted,Tornado)的情况下也是如此。@vartec如果我没有错的话,
多处理
模块从2.6版开始在Python中本机可用。我认为在此之前它被称为
pyprocessing
,是一个独立的第三方模块。@vartec不需要任何第三方额外软件包。Python2.6+以后的版本有很好的内置包用于这种用途。哦,有人提到Twisted,这意味着所有其他答案都会被否决@movieyoda:嗯,出于显而易见的原因(GAE,Jython),我喜欢与2.5兼容。无论如何,也许我遗漏了一些东西,Python 2.6引入了什么对异步web调用的支持?@Nick:不幸的是,由于GIL,Python在线程方面很糟糕(我知道,函数调用是在GIL发布的情况下完成的),所以使用线程而不是延迟异步调用不会带来任何好处。另一方面,事件驱动编程规则即使在实际可以使用线程的情况下(参见:ngnix,lighttpd),显然在Python(Twisted,Tornado)的情况下也是如此。@vartec如果我没有错的话,
多处理
模块从2.6版开始在Python中本机可用。我认为在这之前它被称为
pyprocessing
,一个独立的第三方module.IO代码在没有获得GIL的情况下运行。对于IO绑定的映射,
threading
工作得很好。我想说的是,在考虑Python中的多线程时,需要记住GIL。获取URL数据后,可能需要对其进行解析(创建DOM->CPU密集型),或者直接将其转储到文件中(IO操作)。在后一种情况下,GIL的影响将被淡化,但我