Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 8, 2013 09:56:53

Zverushko
Зарегистрирован: 2013-04-22
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Многопоточность

Доброго дня!
написал код для парсинга яндекс 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)

Офлайн

#2 Ноя. 9, 2013 06:36:15

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Многопоточность

Похоже проблема запаковки для передачи.
1) Перенесите закачку в ф-ию подпроцесса.
2) Передавайте простые элементы в подпроцесс - список ссылок (строк)
3) похоже что map_async не возвращает нужный результат, нужно использовать callback

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version