سؤال

لدي مستند XML يأتي في مقبس أحتاج إلى تحليل والرد على الطيران (أي تحليل شجرة جزئية). ما أود هو طريقة غير حظر للقيام بذلك، حتى أتمكن من القيام بأشياء أخرى أثناء انتظار المزيد من البيانات للمجيء (بدون خيوط).

سيكون هناك شيء مثل IturParse مثاليا إذا أنهى تكرار عندما كان المخزن المؤقت للقراءة فارغا، على سبيل المثال:

context = iterparse(imaginary_socket_file_wrapper)
while 1:
    for event, elem in context:
        process_elem(elem)
    # iteration of context finishes when socket has no more data
    do_other_stuff()
    time.sleep(0.1)

أعتقد أن ساكس سيكون أيضا خيارا، ولكن يبدو أن IterParse يبدو أكثر بساطة لاحتياجاتي. أيه أفكار؟

تحديث:

استخدام المواضيع على ما يرام، ولكنه يقدم مستوى من التعقيد الذي كنت آمل أن أجده. اعتقدت أن المكالمات غير المحظورة ستكون طريقة جيدة للقيام بذلك، ولكني أجد أنه يزيد من تعقيد تحليل XML.

هل كانت مفيدة؟

المحلول

الغوص في مصدر returparse قدم الحل بالنسبة لي. إليك مثال بسيط على بناء شجرة XML على عناصر ذبابة ومعالجة بعد علاماتهم المقربة:

import xml.etree.ElementTree as etree

parser = etree.XMLTreeBuilder()

def end_tag_event(tag):
    node = self.parser._end(tag)
    print node

parser._parser.EndElementHandler = end_tag_event

def data_received(data):
    parser.feed(data)

في حالتي، انتهى بي الأمر إلى إطعام بيانات تكنولوجيا المعلومات من الملتوية، لكن يجب أن تعمل مع مأخذ توصيل غير حظر أيضا.

نصائح أخرى

أعتقد أن هناك عنصرين لهذه، شبكة غير حظر I / O، ومحلل XML موجه نحو الدفق.

بالنسبة إلى السابق، يجب عليك اختيار إطار شبكة غير حظر، أو لفة الحل الخاص بك لهذا. من المؤكد أن الملتوية ستعمل، لكنني أجد شخصيا انقلابا من أطر الرقابة يصعب على ذهني. من المحتمل أن تتبع الكثير من الدول في عمليات استدعاءاتك لإطعام المحلل المحلل. لهذا السبب، أميل إلى العثور عليها Evertlet. أسهل قليلا في البرنامج، وأعتقد أنه سيتحمل جيدا في هذه الحالة.

أساسا يسمح لك بكتابة الكود الخاص بك كما لو كنت تستخدم مكالمة مأخذ حظر (باستخدام حلقة عادية أو مولد أو أي شيء تريده)، إلا أنه يمكنك تفرخه في Coroutine منفصل ("فنجر") الذي سيقوم تلقائيا بإجراء عائد تعاوني عندما تكون عمليات الإدخال / الإخراج كتلة، وبالتالي السماح ل coloutines الأخرى لتشغيل.

هذا يجعل استخدام أي محلل محلل موجه نحو الدفق تافهة مرة أخرى، لأن الرمز منظم مثل مكالمة حظر عادية. هذا يعني أيضا أن العديد من المكتبات التي لا تتعامل مباشرة مع مآخذ أو غيرها من I / O (مثل المحلل على سبيل المثال) لا يجب أن تكون تعديلا خصيصا لتكون غير حظر: إذا كانت كتلة، فإن Eventlet تعطي Coroutine.

من المسلم به الحدث هو بعض الشيء السحر، لكنني أجد أنه يحتوي على منحنى تعليمي أسهل بكثير من الملتوية، والنتائج في رمز أكثر وضوحا لأنك لا تضطر إلى تحويل المنطق "من الداخل إلى الخارج" لتناسب الإطار.

إذا لم تستخدم المواضيع، فيمكنك استخدام حلقة الحدث ومقابس الاستطلاع غير الحظر.

asyncore هي وحدة المكتبة القياسية لمثل هذه الأشياء. ملتوية يكون ال مكتبة ASYNC لبثون، ولكن معقد وربما الوزن الثقيل قليلا لاحتياجاتك.

بدلا من ذلك، multiprocessing هو البديل الخيط غير مؤلم، لكنني أفترض أنك لا تعمل 2.6.

بطريقة أو بأخرى، أعتقد أنك ستضطر إلى استخدام المواضيع أو العمليات الإضافية أو نسج بعض سحر ASYNC معقدة بنفس القدر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top