ভূমিকা
multiprocessing প্যাকেজ প্রসেস-ভিত্তিক প্যারালেলিজম সক্ষম করে। প্রতিটি প্রসেসের নিজস্ব মেমরি স্পেস থাকে, GIL-র বাধা নেই। API threading-এর মতো।
বেসিক প্রসেস তৈরি
from multiprocessing import Process
def display():
print('Hi !! I am Python')
if __name__ == '__main__':
p = Process(target=display)
p.start()
p.join() # প্রসেস শেষ হওয়া পর্যন্ত অপেক্ষা
আর্গুমেন্ট পাস করা
from multiprocessing import Process
def display(name):
print(f'Hi !!! {name}')
if __name__ == '__main__':
p = Process(target=display, args=('Python',))
p.start()
p.join()
একাধিক প্রসেস (কিউব ক্যালকুলেশন)
from multiprocessing import Process
def cube(numbers):
for x in numbers:
print(f'{x} cube is {x**3}')
if __name__ == '__main__':
numbers = [3, 4, 5, 6, 7, 8]
p = Process(target=cube, args=(numbers,))
p.start()
p.join()
print("Done")
দুই প্রসেস সমান্তরাল (কিউব + ইভেন চেক)
from multiprocessing import Process
def cube(numbers):
for x in numbers:
print(f'{x} cube is {x**3}')
def even_no(numbers):
for x in numbers:
if x % 2 == 0:
print(f'{x} is an even number')
if __name__ == '__main__':
numbers = [3, 4, 5, 6, 7, 8]
p1 = Process(target=cube, args=(numbers,))
p2 = Process(target=even_no, args=(numbers,))
p1.start()
p2.start()
p1.join()
p2.join()
print("Done")
ইন্টার-প্রসেস কমিউনিকেশন (IPC)
Pipe (দুই প্রসেসের মধ্যে)
from multiprocessing import Process, Pipe
def sender(conn):
conn.send(['Hi!! I am Python'])
conn.close()
if __name__ == '__main__':
parent_conn, child_conn = Pipe()
p = Process(target=sender, args=(child_conn,))
p.start()
print(parent_conn.recv()) # ['Hi!! I am Python']
p.join()
Queue (বহু প্রসেসের জন্য সেফ)
import multiprocessing
def even_numbers(numbers, q):
for n in numbers:
if n % 2 == 0:
q.put(n)
if __name__ == '__main__':
q = multiprocessing.Queue()
p = multiprocessing.Process(target=even_numbers, args=(range(10), q))
p.start()
p.join()
while not q.empty():
print(q.get())
# আউটপুট: 0 2 4 6 8
Lock (সিঙ্ক্রোনাইজেশন)
from multiprocessing import Process, Lock
def disp_name(lock, name):
lock.acquire()
print('Hi', name)
lock.release()
if __name__ == '__main__':
lock = Lock()
names = ['Aadrika', 'Adwaita', 'Sakya', 'Sanj']
for name in names:
Process(target=disp_name, args=(lock, name)).start()
Logging
import multiprocessing, logging
logger = multiprocessing.log_to_stderr()
logger.setLevel(logging.INFO)
logger.warning('Error has occurred')
সারসংক্ষেপ
Process— নতুন প্রসেস তৈরি।start()/join()— চালানো/অপেক্ষা।Pipe— পয়েন্ট-টু-পয়েন্ট কমিউনিকেশন।Queue— থ্রেড/প্রসেস-সেফ কিউ।Lock— ক্রিটিক্যাল সেকশন সুরক্ষা।- সর্বদা
if __name__ == '__main__':ব্লকের ভেতরে প্রসেস তৈরি করুন (Windows-এ আবশ্যক)।