English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

معالجة متعددة في Python

دعم حزمة معالجة متعددة لإنشاء عملية. إنه يشير إلى دالة تحميل وتنفيذ عملية فرعية جديدة. من أجل إيقاف أو استمرار تنفيذ الحوسبة المتوازية، يجب على عملية الحالية استخدام واجهة API مشابهة لمodule thread لانتظار.

مقدمة

عندما نستخدم Multiprocessing، يجب أولاً إنشاءالعمليةالجسم. ثم، يتكلم عنstart()الطريقة.

مثال على البرنامج

من مكتبة multiprocessing استورد Process
   تعريف display():
      طبع ('Hi !! I am Python')
      if __name__ == '__main__':
      p = Process(target=display)
      p.start()
      p.join()

في هذا المثال، أولاً نقوم بتصدير كلاس Process، ثم نستخدم هذاdisplay()تقوم ببدء عملية Process.

ثم، باستخدامstart()تبدأ العملية، ثم تستخدم هذاjoin()تم إكمال العملية.

يمكننا أيضًا استخدام مفتاح args لنقل المعلمات إلى الدالة.

مثال

من مكتبة multiprocessing استورد Process
   تعريف display(my_name):
   طبع ('Hi !!!' + " " + my_name)
   if __name__ == '__main__':
      p = Process(target=display, args=('Python',))
      p.start()
      p.join()

في هذا المثال، نقوم بإنشاء عملية تcalculate مكعب الرقم وتطبع جميع النتائج على الشاشة.

مثال على البرنامج

من مكتبة multiprocessing استورد Process
   تعريف cube(x):
      للمسار x في my_numbers:
         طبع('%s مكعب هو %s' % (x, x**3))
      if __name__ == '__main__':
         my_numbers = [3, 4, 5, 6, 7, 8]
         p = Process(target=cube, args=('x',))
         p.start()
p.join
طبع ('انه تم')

نتائج الخروج

تمام
3 كوبي هو 27
مكعب 4 هو 64
مكعب 5 هو 125
مكعب 6 هو 216
مكعب 7 هو 343
مكعب 8 هو 512

يمكننا أيضًا إنشاء عدة عمليات دفعة واحدة.

في هذا المثال، أولاً نقوم بإنشاء عملية، وهي process1، تقوم بحساب مكعب عدد واحد، في نفس الوقت، يتم إنشاء عملية ثانية process2 لتحديد ما إذا كان العدد زوجيًا أو فرديًا.

مثال

من مكتبة multiprocessing استورد Process
تعريف cube(x):
   للمسار x في my_numbers:
   طبع('%s مكعب هو %s' % (x, x**3))
تعريف evenno(x):
   للمسار x في my_numbers:
   إذا x % 2 == 0:
   طبع('%s هو عدد زوجي ' % (x))
   if __name__ == '__main__':
      my_numbers = [3, 4, 5, 6, 7, 8]
      my_process1 = Process(target=cube, args=('x',))
      my_process2 = Process(target=evenno, args=('x',))
      my_process1.start()
      my_process2.start()
      my_process1.join()
   my_process2.join()
طبع ('انه تم')

نتائج الخروج

3 كوبي هو 27
مكعب 4 هو 64
مكعب 5 هو 125
مكعب 6 هو 216
مكعب 7 هو 343
مكعب 8 هو 512
4 هو عدد زوجي
6 هو عدد زوجي
8 هو عدد زوجي
تمام

تواصل العمليات

يدعم معالجة متعددة الأنابيب والصفوف، وهي نوعان من قنوات التواصل بين العمليات.

الأنبوب

في معالجة متعددة، عندما نريد التواصل بين العمليات، في هذه الحالة يمكننا استخدام الباب.الباب

مثال

from multiprocessing import Process, Pipe
   def myfunction(conn):
      conn.send(['hi!! I am Python'])
      conn.close()
      if __name__ == '__main__':
         parent_conn, child_conn = Pipe()         p = Process(target=myfunction, args=(child_conn,))
         p.start()
      print (parent_conn.recv() )
p.join()

نتائج الخروج

['hi !!! I am Python']

يعود بوقتي اتصالين عبر الباب، يمثل كل منهما طرفي الباب. يحتوي كل كائن اتصال على طريقتينsend()، واحدة هيrecv()طريقة واحدة هي الطريقة، وثانية هي الطريقة.

في هذا المثال، أولاً نقوم بإنشاء عملية تُطبع الرسالة “ hi !! I am Python”, ثم مشاركة البيانات.

سلسلة s

عندما ننقل البيانات بين العمليات، في هذه الحالة يمكننا استخدام كائن Queue.

مثال

import multiprocessing
   def evenno(numbers, q):
      for n in numbers:
      if n % 2 == 0:
      q.put(n)
      if __name__ == "__main__":
         q = multiprocessing.Queue()
         p = multiprocessing.Process(target=evenno, args=(range(10), q))
         p.start()
         p.join()
   while q:
print(q.get())

نتائج الخروج

0
2
4
6
8

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

في النهاية، نقوم بالتحقق من أن الليستة فارغة.

عندما نقوم بطباعة الأرقام، نقوم أولاً بطباعة القيمة التي تأتي في مقدمة الليستة، ثم الطباعة التالية، وهكذا.

الأقفال

في هذه الحالة، إذا كنا نريد تنفيذ عملية واحدة فقط في كل مرة، فإننا نستخدم Locks. هذا يعني أن الوقت سيمنع تنفيذ العمليات الأخرى للكود المماثل. بعد اكتمال العملية، يتم إطلاق القفل.

مثال على استخدام Locks

مثال

from multiprocessing import Process, Lock
def dispmay_name(l, i):
l.acquire()
print('Hi', i)
   l.release()
if __name__ == '__main__':
   my_lock = Lock() my_name = ['Aadrika', 'Adwaita', 'Sakya', 'Sanj']
for name in my_name:
Process(target=dispmay_name, args=(my_lock,name)).start()

نتائج الخروج

Hi Aadrika
Hi Adwaita
Hi Sakya
Hi Sanj

السجلات

يقدم مكتبة الإدارة المتعددة أيضًا مكتبة تسجيل، لضمان عدم خلط الرسائل بين العمليات أثناء التنفيذ إذا لم يستخدم مكتبة تسجيل ميزة القفل.

مثال

import multiprocessing, logging
logger = multiprocessing.log_to_stderr()
logger.setLevel(logging.INFO)
logger.warning('Error has occurred')

في هذا المثال، أولاً نقوم ب导入 مكتبات التسجيل والإدارة المتعددة، ثم نستخدم طريقة multiprocessing.log_to_stderr(). بعد ذلك، نكلم get_logger() ونضعه في sys.stderr، وأخيرًا نضبط مستوى السجل وننقل الرسالة.

الشائع لك