2016-08-05 27 views
0

sagen, dass ich ein Programm, das wie folgt aussieht:Gleichzeitig analysieren XML-Struktur im Speicher mit 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 befreit die GIL, so dass es möglich sein sollte, a und b gleichzeitig in getrennten Threads oder Prozesse ausgeführt werden .

Aus der lxml docs:

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.

Ich habe keine Arbeit mit Multithreading wenig getan.

Ihre Lauf der Multiprozessor-Implementierung würde so etwas wie multiprocessing.Pool().map() verwenden, was hier keinen Sinn macht, da ich eine Liste von Funktionen und ein einzelnes Argument anstelle einer einzelnen Funktion und einer Liste von Argumenten habe. Der Versuch, jede Funktion in einer anderen Funktion zu wickeln und dann wie beschrieben Multi-Prozess-in eine der Antworten wirft die folgende Ausnahme:

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

Ist es möglich, zu tun, was ich beschreibe? Wenn das so ist, wie?

+0

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

+0

@PadraicCunningham Ich verstehe nicht, wie das hilft. An und für sich, was Sie verlinkt haben, beantwortet meine Frage nicht. In jedem Fall ist der Fehler, den ich mit der folgenden Antwort erfahre, darauf zurückzuführen, dass Funktionen nicht putzfähig sind. Eine Registrierung mit dem Abbeizer würde das nicht lösen. – AutomaticStatic

Antwort

1

Funktionen Daten sind, so können Sie etwas tun:

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: Kann nicht : Attributsuche __builtin __. Function failed' – AutomaticStatic

+0

Der obige Code läuft ohne Fehler unter Python 2.7. Wie kommst du zu diesem Fehler? – ErikR

+0

Ok - Ich sehe jetzt die Updates zu Ihrer Frage. – ErikR