Python 对函数使用多处理失败-字符串索引必须为整数

Python 对函数使用多处理失败-字符串索引必须为整数,python,multithreading,Python,Multithreading,我有一个函数,在一个线程中工作。这里有一个简化的例子。基本上,我想验证几个死链接,并将结果存储在字典列表中的每个项中 import requests import sys import logging def main(): urls_to_check = [{'url': 'http://example.com'}, {'url': 'http://example.com'}, {'url': '

我有一个函数,在一个线程中工作。这里有一个简化的例子。基本上,我想验证几个死链接,并将结果存储在字典列表中的每个项中

import requests
import sys
import logging

def main():  
    urls_to_check = [{'url': 'http://example.com'},
                     {'url': 'http://example.com'},
                     {'url': 'http://example.com'}]
    print check_for_404(urls_to_check)

def check_for_404(urls_to_check):
    for item in urls_to_check:
        r = requests.get(item['url'])
        item.update({'responseCode': r.status_code})
    return urls_to_check

if __name__ == '__main__':
    try:
        main()
    except:
        logging.error("Unexpected error:" + str(sys.exc_info()))
产出:

[{'url': 'http://example.com', 'responseCode': 200}, {'url': 'http://example.com', 'responseCode': 200}, {'url': 'http://example.com', 'responseCode': 200}]
我对此感到高兴

现在,如果我实现多处理,我的理解是在多个核之间分割一个iterable,并通过函数运行iterable的一部分

import requests
import sys
import logging
from multiprocessing import Pool

def main():  
    urls_to_check = [{'url': 'http://example.com'},
                     {'url': 'http://example.com'},
                     {'url': 'http://example.com'}]
    p = Pool(5)
    print p.map(check_for_404, urls_to_check)

def check_for_404(urls_to_check):
    for item in urls_to_check:
        r = requests.get(item['url'])
        item.update({'responseCode': r.status_code})
    return urls_to_check

if __name__ == '__main__':
    try:
        main()
    except:
        logging.error("Unexpected error:" + str(sys.exc_info()))
我得到了错误
TypeError('字符串索引必须是整数,而不是str',),)

如何实现多处理,以便更快地处理一长串URL

这是我正在看的教程:

您需要更改“检查404”功能以接受单个url而不是列表;map函数一次传递一个列表元素(以分离池中的子流程),然后在末尾将它们重新组合成一个列表:

def check_for_404(item):
    r = requests.get(item['url'])
    item.update({'responseCode': r.status_code})
    return item
您需要更改“Checkfor404”函数,以接受单个url而不是列表;map函数一次传递一个列表元素(以分离池中的子流程),然后在末尾将它们重新组合成一个列表:

def check_for_404(item):
    r = requests.get(item['url'])
    item.update({'responseCode': r.status_code})
    return item

请显示完整的错误消息和完整的回溯。请显示完整的错误消息和完整的回溯。当被多处理器调用时,函数可以接受其他参数吗?e、 g.
def check_for_404(项目,我可能想使用的一些其他字符串):
我认为最简单的方法是在dict中包含所有参数,例如,
{'url':'example.com','other_string':'blablabla'}
,然后让你的函数将它们取出。是的,我认为这也可能是一个想法。再次感谢。嗯,因为迭代发生在函数的外部(正如所讨论的是为单个项设置的)。因此,在函数中解包字典是行不通的。你是什么意思?字典被传递给函数,这就是
item
是什么。当被多处理器调用时,函数可以接受其他参数吗?e、 g.
def check_for_404(项目,我可能想使用的一些其他字符串):
我认为最简单的方法是在dict中包含所有参数,例如,
{'url':'example.com','other_string':'blablabla'}
,然后让你的函数将它们取出。是的,我认为这也可能是一个想法。再次感谢。嗯,因为迭代发生在函数的外部(正如所讨论的是为单个项设置的)。因此,在函数中解包字典是行不通的。你是什么意思?字典被传递给函数,这就是
item
的含义。