2016-08-05 4 views
0

Скажем, у меня есть программа, которая выглядит следующим образом:Одновременно разбора в памяти XML дерево с LXML

from lxml import etree 

class ParseXmlFile(object): 
    def __init__(self, xml_to_parse): 
     self.xml = etree.parse(xml_to_parse) 

    def a(self): 
     return self.xml.xpath('//something') 

    def b(self): 
     return self.xml.xpath('//something-else') 

LXML освобождает GIL, поэтому она должна быть возможность запускать a и b одновременно в отдельных потоков или процессов ,

Из LXML документы:

lxml frees the GIL (Python's global interpreter lock) internally when parsing from disk and memory...The global interpreter lock (GIL) in Python serializes access to the interpreter, so if the majority of your processing is done in Python code (walking trees, modifying elements, etc.), your gain will be close to zero. The more of your XML processing moves into lxml, however, the higher your gain. If your application is bound by XML parsing and serialisation, or by very selective XPath expressions and complex XSLTs, your speedup on multi-processor machines can be substantial.

Я сделал немного никакой работы с многопоточностью.

Ваш запуск реализации многопроцессорной обработки мельницы будет использовать что-то вроде multiprocessing.Pool().map(), что кажется бесполезным здесь, поскольку у меня есть список функций и один аргумент, а не одна функция и список аргументов. Попытка обернуть каждую функцию в другую функцию, а затем многопроцессном, как описано в один из ответов вызывает следующее исключение:

cPickle.PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed 

Можно ли делать то, что я описываю? Если да, то как?

+0

http://stackoverflow.com/questions/25991860/unable-to-pass-an-lxml-etree-object-to- a-separate-process –

+0

@PadraicCunningham Я не понимаю, как это помогает. Само по себе то, к чему вы связались, не отвечает на мой вопрос. В любом случае ошибка, которую я испытываю с ответом ниже, связана с тем, что функции не расходуются. Регистрация этре с сортировщиком не решит этого. – AutomaticStatic

ответ

1

Функции данных, так что вы можете сделать что-то вроде этого:

from multiprocessing import Pool 

def f1(xml): 
    print "applying f1 to xml" 

def f2(xml): 
    print "applying f2 to xml" 

if __name__ == '__main__': 
    xml = "the xml" 

    def applyf(f): 
     f(xml) 

    p = Pool(5) 
    print(p.map(applyf, [f1, f2])) 
+0

'cPickle.PicklingError: не может pickle : поиск атрибута __builtin __. Function failed' – AutomaticStatic

+0

Код выше работает без ошибок под python 2.7. Как вы получаете эту ошибку? – ErikR

+0

Хорошо. Теперь я вижу обновления на ваш вопрос. – ErikR

 Смежные вопросы

  • Нет связанных вопросов^_^