Найти - Пользователи
Полная версия: Многопоточность
Начало » Python для новичков » Многопоточность
1
Zverushko
Доброго дня!
написал код для парсинга яндекс 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

Без потоков работает но долго
До заворачивания в функцию тоже все работало, видимо проблема в этом
Можно ли это обойти?
Заранее спасибо!
o7412369815963
Похоже проблема запаковки для передачи.
1) Перенесите закачку в ф-ию подпроцесса.
2) Передавайте простые элементы в подпроцесс - список ссылок (строк)
3) похоже что map_async не возвращает нужный результат, нужно использовать callback
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB