python多处理池冻结

时间:2014-07-03 22:05:41

标签: python multiprocessing pool

使用python 2.7 我有这段代码:

import urllib2
import time
import os
import sys
import multiprocessing
from multiprocessing import Pool
WORKER_COUNT = 10

def worker(url):
    print url
    try:
        response = urllib2.urlopen(url)
        html = response.read()
    except Exception as ex:
        pass

if __name__ == "__main__":
    urls = [
        'http://localhost:90/',
        'http://localhost:90/Default.aspx',
        'http://localhost:91/?a=2&m=0',
        'http://localhost:91/?a=2&m=1',
        'http://localhost:91/?a=2&m=2',
        'http://localhost:91/?s=2',
        'http://localhost:91/?a=2&ft=false',
        'http://localhost:91/?a=2&f=false',
        'http://localhost:91/?fail=1',
        'http://localhost:91/?fail=query',
        'http://localhost:92/?a=2&m=0',
        'http://localhost:92/?a=2&m=1',
        'http://localhost:92/?a=2&m=2',
        'http://localhost:92/?s=2'
        ]
    while True:
        p = Pool(WORKER_COUNT)
        p.map(worker, urls[0:4])# too many urls will cause it to freeze up
        print "Restart"
        time.sleep(5)

当我使用所有网址(可能有30个网址)时,它会在通过第一套网格后冻结。 当我使用上面代码中的5个url(url [0:4])时,它不会冻结。 有什么想法吗? 代码是一个测试代码,因此它应该永远运行(几个小时)。

1 个答案:

答案 0 :(得分:0)

ops,此问题与Pool无关。 它冻结了一些网址。 我通过添加超时来修复它:

import socket
try:
    response = urllib2.urlopen(url, timeout=10)
    html = response.read()
except socket.timeout:
    print "timout"
    pass

另请注意,使用过多的工作人员会导致应用程序因资源不足而冻结。