Скажем, у меня есть программа, которая выглядит следующим образом:Одновременно разбора в памяти 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
Можно ли делать то, что я описываю? Если да, то как?
http://stackoverflow.com/questions/25991860/unable-to-pass-an-lxml-etree-object-to- a-separate-process –
@PadraicCunningham Я не понимаю, как это помогает. Само по себе то, к чему вы связались, не отвечает на мой вопрос. В любом случае ошибка, которую я испытываю с ответом ниже, связана с тем, что функции не расходуются. Регистрация этре с сортировщиком не решит этого. – AutomaticStatic