Форум сайта python.su
0
Доброго дня!
написал код для парсинга яндекс xml
def ya_parse(query_list,domain,region='213'): #собираю данные ya_user=**** ya_key=**** ya_url='http://xmlsearch.yandex.ru/xmlsearch?user='+ya_user+'&key='+ya_key+'&lr='+region defaults_xml='''<?xml version="1.0" encoding="UTF-8"?> <request> <query>%s</query> <groupings> <groupby attr="d" mode="deep" groups-on-page="100" docs-in-group="1" /> </groupings> </request>''' # отправляю в яндекс и получаю ответ def response(query): return (urllib.request.urlopen(ya_url,((defaults_xml % query).encode())).read().decode()) # создаю список для последующего использования в Pool xmls=[(query,response(query),domain) for query in query_list] # функция для разбора xml и определения позиции def parse(data): query,xml,domain=data urls=[node.childNodes[0].nodeValue.lower() for node in parseString(xml).getElementsByTagName('url')] try: poz,url=[x for x in enumerate(urls,start=1) if domain in x[1]][0] return (query,poz,url) except IndexError: return (query,'-','-') # пытаюсь использовать потоки для функции parse pool=multiprocessing.Pool(processes=2) results=pool.map_async(parse,xmls) pool.close() return results
Exception in thread Thread-2: Traceback (most recent call last): File "/usr/lib/python3.2/threading.py", line 740, in _bootstrap_inner self.run() File "/usr/lib/python3.2/threading.py", line 693, in run self._target(*self._args, **self._kwargs) File "/usr/lib/python3.2/multiprocessing/pool.py", line 346, in _handle_tasks put(task) _pickle.PicklingError: Can't pickle <class 'function'>: attribute lookup builtins.function failed
Отредактировано Zverushko (Ноя. 8, 2013 10:01:10)
Офлайн
32
Похоже проблема запаковки для передачи.
1) Перенесите закачку в ф-ию подпроцесса.
2) Передавайте простые элементы в подпроцесс - список ссылок (строк)
3) похоже что map_async не возвращает нужный результат, нужно использовать callback
Офлайн