كيف يمكنك مشاركة البيانات بين الوالد و متشعب عملية طفل في الثعبان ؟

StackOverflow https://stackoverflow.com/questions/218935

  •  03-07-2019
  •  | 
  •  

سؤال

أنا متأكد من أن تفعل هذا باستخدام نظام التشغيل.بلوك(op) وظيفة, ولكن ليس لدي أي فكرة كيف.أيضا, إذا كان هناك طريقة أفضل, سأكون ممتنا إلى معرفة.مقتطفات الشفرة هي موضع ترحيب للغاية.

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

المحلول

العمليات الفرعية يحل محل os.popen، os.system، os.spawn، popen2 والأوامر. ومن شأن مثال بسيط لأنابيب على النحو التالي:

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]

ويمكنك أيضا استخدام ملف تعيين الذاكرة مع العلم = MAP_SHARED عن الذاكرة المشتركة بين العمليات.

متعدد المعالجة الملخصات على حد سواء <لأ href = "HTTP: //docs.python. غزاله / مكتبة / multiprocessing.html # تبادل الكائنات بين-العمليات "يختلط =" noreferrer "> أنابيب و <لأ href =" http://docs.python.org/library/multiprocessing.html#sharing -state بين-العمليات "يختلط =" noreferrer "> الذاكرة المشتركة ويوفر واجهة مستوى أعلى. مأخوذة من وثائق المعالجة:

from multiprocessing import Process, Pipe

def f(conn):
    conn.send([42, None, 'hello'])
    conn.close()

if __name__ == '__main__':
    parent_conn, child_conn = Pipe()
    p = Process(target=f, args=(child_conn,))
    p.start()
    print parent_conn.recv()   # prints "[42, None, 'hello']"
    p.join()

نصائح أخرى

ونلقي نظرة على متعدد المعالجة حدة نمطية جديدة في بيثون 2.6 (متاح أيضا للإصدارات السابقة من pyprocessing

وهنا مثال من مستندات توضح المعلومات التي تمر باستخدام الأنابيب على سبيل المثال:

from multiprocessing import Process, Pipe

def f(conn):
    conn.send([42, None, 'hello'])
    conn.close()

if __name__ == '__main__':
    parent_conn, child_conn = Pipe()
    p = Process(target=f, args=(child_conn,))
    p.start()
    print parent_conn.recv()   # prints "[42, None, 'hello']"
    p.join()

وهذا هو الى حد كبير بيثون مستقل! انها مثال كلاسيكي ليونكس اتصال interprocess. خيار واحد جيد هو استخدام popen() لفتح الأنابيب بين العمليات الأم والطفل، وتمرير البيانات / الرسائل ذهابا وإيابا على طول الأنبوب.

ونلقي نظرة على subprocess حدة ، والتي يمكن إعداد الأنابيب اللازمة تلقائيا أثناء وضع البيض العمليات التابعة.

لديك خياران: os.popen* في os وحدة, أو يمكنك استخدام subprocess وحدة إلى نفس التأثير.الثعبان الدليل جميلة الوثائق و الأمثلة popen و subprocess.

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

وهناك الكامل المثال هنا ، ولكن أساسا يمكنك الجمع بين نظام التشغيل التعامل مع الملف و mmap وحدات:

import mmap, os, tempfile
fd, tmpfile = tempfile.mkstemp()
os.write(fd, '\x00' * mmap.PAGESIZE)
os.lseek(fd, 0, os.SEEK_SET)
child_pid = os.fork()
if child_pid:
    buf = mmap.mmap(fd, mmap.PAGESIZE, mmap.MAP_SHARED, mmap.PROT_READ)
    os.waitpid(child_pid, 0)
    child_message = buf.readline()
    print(child_message)
    os.close(fd)
else:
    buf = mmap.mmap(fd, mmap.PAGESIZE, mmap.MAP_SHARED, mmap.PROT_WRITE)
    buf.write('testing\n')
    os.close(fd)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top