pool.map列表索引超出范围python

时间:2017-02-11 06:14:06

标签: python windows python-2.7 multiprocessing pool

大概有70%的机会显示错误:

bool check(string to_be_Searched,string search_here)
{
    for(int i=0,j=0;j<to_be_searched.length() && i<search_here.length();i++)
    {
       if(to_be_Searched[j]==search_here[i])
          j++;
    }
    return j==to_be_searched.length();
 }

不知道为什么,如果数据少于100,只有5%的机会显示该消息。任何人都知道如何改进?

    res=pool.map(feng,urls)
  File "c:\Python27\lib\multiprocessing\pool.py", line 251, in map
    return self.map_async(func, iterable, chunksize).get()
  File "c:\Python27\lib\multiprocessing\pool.py", line 567, in get
    raise self._value
IndexError: list index out of range

stackoverflow:正文不能包含&#34;`pool ma p&#34;。 将其更改为res = pool.map4(feng,urls) 我试图通过多处理从这个网站获得一些子字符串。

1 个答案:

答案 0 :(得分:0)

实际上,multiprocessing使调试有点困难,因为您没有看到index out of bound错误发生的位置(错误消息使其看起来好像发生在multiprocessing内部}模块)。

在某些情况下,这一行:

content=str(soupout[1])

引发index out of bound,因为羹是一个空列表。如果将其更改为

if len(soupout) == 0:
    return None

然后删除通过更改

返回的None
res=pool.map(feng,urls)

res = pool.map(feng,urls)
res = [r for r in res if r is not None]

然后你可以避免错误。那就是说。您可能想要找出re.findall返回空列表的根本原因。选择具有beatifulsoup的节点比使用正则表达式更好,因为通常与bs4匹配更稳定,特别是如果网站略微更改其标记(例如空格等)

<强>更新

  

为什么soupout是一个空列表?当我没有使用pool.map时,我从未显示此错误消息

这可能是因为您过快地敲击了Web服务器。在评论中,您提到您有时会在504中获得response.status_code。 504表示Gateway Time-out: The server was acting as a gateway or proxy and did not receive a timely response from the upstream server

这是因为haoshiwen.org似乎是由kangle驱动的,这是一个反向代理。现在,反向代理处理您发送给后面的Web服务器的所有请求,如果您现在启动太多进程,那么糟糕的Web服务器无法处理泛滥。 Kangle has a default timeout of 60s所以,一旦他在60秒内没有从网络服务器回复,他就会显示你发布的错误。

你如何解决这个问题?

  • 您可以限制流程数量:pool=multiprocessing.Pool(2),您需要使用大量流程
  • 位于feng(url)的顶部,您可以添加time.sleep(5),以便每个进程在每个请求之间等待5秒。在这里你还需要玩弄睡眠时间。