কম্পিউটার

পাইথনে মাল্টি-থ্রেডিং সহ সকেট প্রোগ্রামিং?


মাল্টিথ্রেডিং ধারণা

মাল্টিথ্রেডিং হল প্রায় সমস্ত আধুনিক প্রোগ্রামিং ল্যাঙ্গুয়েজ বিশেষ করে পাইথনের মূল ধারণা কারণ এটির থ্রেডের সরল প্রয়োগ।

একটি থ্রেড হল একটি প্রোগ্রামের মধ্যে একটি সাব-প্রোগ্রাম যা কোডের অন্যান্য বিভাগ থেকে স্বাধীনভাবে চালানো যেতে পারে। একটি থ্রেড একই কনটেক্সট শেয়ারিং প্রোগ্রামের মেমরির মতো রানেবল রিসোর্স চালায়।

যখন একটি একক প্রক্রিয়ায়, আমরা একসাথে একাধিক থ্রেড নির্বাহ করি, তখন একে মাল্টিথ্রেডিং বলে।

থ্রেড বাস্তবায়নের জন্য পাইথন মাল্টিথ্রেডিং মডিউল

প্রোগ্রামগুলিতে থ্রেড প্রয়োগ করতে, পাইথন দুটি মডিউল প্রদান করে −

  • থ্রেড (পাইথন 2.x এর জন্য) বা _thread (পাইথন 3.x এর জন্য) মডিউল
  • থ্রেডিং মডিউল

যেখানে থ্রেড মডিউল একটি ফাংশন হিসাবে একটি থ্রেড তৈরি করে যেখানে থ্রেডিং মডিউল একটি থ্রেড তৈরি করার জন্য একটি অবজেক্ট-ওরিয়েন্টেড পদ্ধতি প্রদান করে৷

সিনট্যাক্স

_thread.start_new_thread(func, args[, kwargs])

উপরে একটি নতুন থ্রেড শুরু করে এবং এর শনাক্তকারী প্রদান করে। প্রথম আর্গুমেন্ট হল একটি ফাংশন ফাংশন যা থ্রেডটি দ্বিতীয় আর্গুমেন্টের সাথে একটি টিপল সহ আর্গুমেন্টের অবস্থানগত তালিকা সহ এক্সিকিউট করে। ঐচ্ছিক kwargs আর্গুমেন্ট কীওয়ার্ড আর্গুমেন্টের একটি অভিধান নির্দিষ্ট করে। যখন ফাংশনটি ফিরে আসে, থ্রেডটি নিঃশব্দে বিদ্যমান থাকে।

এতে, আমরা একটি ক্লায়েন্ট-সার্ভার অ্যাপ্লিকেশনের একটি মৌলিক উদাহরণ দেখতে পাই। যেখানে ক্লায়েন্টরা মূলত একটি সকেট সংযোগ খুলে সার্ভারে প্রশ্ন পাঠায়। সার্ভার উত্তর দেয়।

কোনো যুক্তি ছাড়াই চলার সময়, এই প্রোগ্রামটি একটি TCP সকেট সার্ভার দিয়ে শুরু হয় যা পোর্ট 8000-এ 127.0.0.1 সংযোগের জন্য শোনে।

client_thread1.py

 import socketimport sysdef main():soc =socket.socket(socket.AF_INET, socket.SOCK_STREAM) host ="127.0.0.1" পোর্ট =8000 চেষ্টা করুন:soc.connect((হোস্ট, পোর্ট)) ছাড়া:print( "সংযোগ ত্রুটি") sys.exit() প্রিন্ট ("প্রস্থান করার জন্য 'প্রস্থান করুন' লিখুন") বার্তা =ইনপুট(" -> ") যখন বার্তা!='ছাড়ুন':soc.sendall(message.encode("utf8") )) if soc.recv(5120).decode("utf8") =="-":পাস # নাল অপারেশন বার্তা =ইনপুট(" -> ") soc.send(b'--quit--') if __name__ =="__প্রধান__":প্রধান()

যেখানে সার্ভার প্রোগ্রাম হল,

server_thread1.py

থ্রেডিং ইম্পোর্ট থ্রেডডেফ মেইন():start_server()def start_server():host ="127.0.0.1" পোর্ট =8000 # আরবিট্রারি নন-প্রিভিলেজড পোর্ট soc =socket.socket(INET_AF., সকেট। SOCK_STREAM) soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) মুদ্রণ("সকেট তৈরি করা হয়েছে") চেষ্টা করুন:soc.bind((হোস্ট, পোর্ট)) ব্যতীত:প্রিন্ট("বাঁধন ব্যর্থ হয়েছে। ত্রুটি :" + str(sys) .exc_info())) sys.exit() soc.listen(6) # 6 টি অনুরোধ পর্যন্ত সারি প্রিন্ট ("সকেট এখন শুনছে") # অসীম লুপ- প্রতিটি অনুরোধের জন্য রিসেট করবেন না যখন সত্য:সংযোগ, ঠিকানা =soc। accept() ip, port =str(address[0]), str(address[1]) print(" + ip + ":" + পোর্টের সাথে সংযুক্ত) চেষ্টা করুন:Thread(target=client_thread, args=(সংযোগ, ip, port)).start() ছাড়া:print("থ্রেড শুরু হয়নি।") traceback.print_exc() soc.close()def clientThread(connection, ip, port, max_buffer_size =5120):is_active =True while is_active :clie nt_input =receive_input(সংযোগ, max_buffer_size) যদি "--QUIT--" ক্লায়েন্ট_ইনপুটে:প্রিন্ট ("ক্লায়েন্ট প্রস্থান করার জন্য অনুরোধ করছে") সংযোগ. বন্ধ () প্রিন্ট ("সংযোগ" + ip + ":" + পোর্ট + " বন্ধ ") is_active =False else:প্রিন্ট("প্রসেসড ফলাফল:{}".format(client_input)) connection.sendall("-".encode("utf8"))def receive_input(connection, max_buffer_size):client_input =connection.recv (max_buffer_size) client_input_size =sys.getsizeof(client_input) if client_input_size> max_buffer_size:প্রিন্ট("ইনপুট সাইজ প্রত্যাশিত {}" এর চেয়ে বেশি। ফরম্যাট(ক্লায়েন্ট_ইনপুট_সাইজ)) ডিকোড_ইনপুট =ক্লায়েন্ট_ইনপুট.ডিকোড (") ফলাফল =process_input(decoded_input) return resultdef process_input(input_str):প্রিন্ট("ক্লায়েন্ট থেকে প্রাপ্ত ইনপুট প্রক্রিয়াকরণ") রিটার্ন "হ্যালো" + str(input_str).upper()if __name__ =="__main__":main()

উপরের স্ক্রিপ্ট চালানোর সময়, টার্মিনালে সার্ভার_thread1.py চালান,

python server_thread1.pySocket createdSocket এখন শুনছে

আমরা সার্ভার উইন্ডো দেখব এবং প্রবাহ বুঝতে পারব। এখন একাধিক ক্লায়েন্ট টার্মিনাল খুলুন, ক্লায়েন্ট থ্রেড চালান

python client_thread1.pyEnter 'quit' to exit-> Zack->

অন্য টার্মিনালে, অন্য ক্লায়েন্ট প্রোগ্রাম চালান এবং সার্ভার টার্মিনাল উইন্ডোও দেখুন,

python client_thread1.pyEnter 'quit' to exit-> Python-> প্রস্থান করুন

আরেকটি টার্মিনাল, ক্লায়েন্ট থ্রেড চালান,

python client_thread1.pyEnter 'quit' to exit-> world!-> Anothny->

এবং আমরা দেখতে পাচ্ছি আমাদের সার্ভার উইন্ডো আউটপুট প্রদর্শন করবে যেমন কিছু,

সকেট তৈরি সকেট এখন শুনছে 127.0.0.1:50275ক্লায়েন্ট থেকে প্রাপ্ত ইনপুট প্রসেস করা হচ্ছে প্রসেস করা ফলাফল:হ্যালো ZACKConnected with 127.0.0.1:50282ক্লায়েন্ট থেকে প্রাপ্ত ইনপুট প্রসেস করা হচ্ছে প্রসেসড রেজাল্ট:হ্যালো পাইথন ক্লায়েন্ট থেকে প্রাপ্ত ইনপুট প্রসেস করা হচ্ছে। 50282 বন্ধ 127.0.0.1:50285ক্লায়েন্ট থেকে প্রাপ্ত ইনপুট প্রক্রিয়াকরণের সাথে সংযুক্ত প্রসেসড ফলাফল:হ্যালো ওয়ার্ল্ড!ক্লায়েন্ট থেকে প্রাপ্ত ইনপুট প্রক্রিয়াকরণ প্রক্রিয়া করা ফলাফল:হ্যালো অ্যানোথনি

তাই থ্রেডগুলি একাধিক সকেট সংযোগ এবং ক্লায়েন্ট পরিচালনা করার জন্য সবচেয়ে সাধারণ কৌশলগুলির একটি প্রদান করে৷


  1. পাইথনে Tkinter প্রোগ্রামিং

  2. উইন্ডোজে পাইথন প্রোগ্রামিংয়ের জন্য IDE

  3. পাইথনে মেটাক্লাসের সাথে মেটা প্রোগ্রামিং

  4. পাইথনে কচ্ছপ প্রোগ্রামিং