Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Python

पायथन में मल्टी-थ्रेडिंग के साथ सॉकेट प्रोग्रामिंग?

मल्टीथ्रेडिंग अवधारणाएं

मल्टीथ्रेडिंग लगभग सभी आधुनिक प्रोग्रामिंग भाषाओं की मूल अवधारणा है, विशेष रूप से अजगर के धागे के सरलीकृत कार्यान्वयन के कारण।

एक थ्रेड एक प्रोग्राम के भीतर एक उप-प्रोग्राम है जिसे कोड के अन्य अनुभाग से स्वतंत्र रूप से निष्पादित किया जा सकता है। एक थ्रेड एक ही संदर्भ साझा करने वाले प्रोग्राम के मेमोरी जैसे चलने योग्य संसाधनों में निष्पादित होता है।

जब एक ही प्रक्रिया में, हम एक साथ कई थ्रेड्स निष्पादित कर रहे होते हैं, तो इसे मल्टीथ्रेडिंग कहा जाता है।

थ्रेड कार्यान्वयन के लिए पायथन मल्टीथ्रेडिंग मॉड्यूल

कार्यक्रमों में धागे को लागू करने के लिए, पायथन दो मॉड्यूल प्रदान करता है -

  • थ्रेड (पायथन 2.x के लिए) या _थ्रेड (पायथन 3.x के लिए) मॉड्यूल
  • थ्रेडिंग मॉड्यूल

जहां थ्रेड मॉड्यूल फ़ंक्शन के रूप में थ्रेड बनाता है जबकि थ्रेडिंग मॉड्यूल थ्रेड बनाने के लिए ऑब्जेक्ट-ओरिएंटेड दृष्टिकोण प्रदान करता है।

सिंटैक्स

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

ऊपर एक नया धागा शुरू होता है और इसकी पहचानकर्ता देता है। पहला तर्क एक फ़ंक्शन func है जिसे थ्रेड दूसरे तर्क के साथ निष्पादित करता है जिसमें तर्कों की स्थितिगत सूची के साथ एक टपल होता है। वैकल्पिक kwargs तर्क कीवर्ड तर्कों का एक शब्दकोश निर्दिष्ट करता है। जब फ़ंक्शन वापस आता है, तो थ्रेड चुपचाप मौजूद रहता है।

इसमें, हम क्लाइंट-सर्वर एप्लिकेशन का एक मूल उदाहरण देखते हैं। जहां क्लाइंट मूल रूप से सॉकेट कनेक्शन खोलते हैं और सर्वर को क्वेरी भेजते हैं। सर्वर वापस प्रतिक्रिया करता है।

बिना किसी तर्क के चलने पर, यह प्रोग्राम एक TCP सॉकेट सर्वर से शुरू होता है जो पोर्ट 8000 पर 127.0.0.1 के कनेक्शन को सुनता है।

client_thread1.py

import socket
import sys
def main():
   soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   host = "127.0.0.1"
   port = 8000
   try:
      soc.connect((host, port))
   except:
      print("Connection Error")
      sys.exit()
   print("Please enter 'quit' to exit")
   message = input(" -> ")
   while message != 'quit':
      soc.sendall(message.encode("utf8"))
      if soc.recv(5120).decode("utf8") == "-":
         pass # null operation
      message = input(" -> ")
   soc.send(b'--quit--')
if __name__ == "__main__":
   main()

जबकि सर्वर प्रोग्राम है,

server_thread1.py

import socket
import sys
import traceback
from threading import Thread
def main():
   start_server()
def start_server():
   host = "127.0.0.1"
   port = 8000 # arbitrary non-privileged port
   soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
   print("Socket created")
   try:
      soc.bind((host, port))
   except:
      print("Bind failed. Error : " + str(sys.exc_info()))
      sys.exit()
   soc.listen(6) # queue up to 6 requests
   print("Socket now listening")
   # infinite loop- do not reset for every requests
   while True:
      connection, address = soc.accept()
      ip, port = str(address[0]), str(address[1])
      print("Connected with " + ip + ":" + port)
   try:
      Thread(target=client_thread, args=(connection, ip, port)).start()
   except:
      print("Thread did not start.")
      traceback.print_exc()
   soc.close()
def clientThread(connection, ip, port, max_buffer_size = 5120):
   is_active = True
   while is_active:
      client_input = receive_input(connection, max_buffer_size)
      if "--QUIT--" in client_input:
         print("Client is requesting to quit")
         connection.close()
         print("Connection " + ip + ":" + port + " closed")
         is_active = False
      else:
         print("Processed result: {}".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:
      print("The input size is greater than expected {}".format(client_input_size))
   decoded_input = client_input.decode("utf8").rstrip()
   result = process_input(decoded_input)
   return result
def process_input(input_str):
   print("Processing the input received from client")
   return "Hello " + str(input_str).upper()
if __name__ == "__main__":
   main()

स्क्रिप्ट के ऊपर चलने पर, टर्मिनल में server_thread1.py इस रूप में चलाएँ,

python server_thread1.py
Socket created
Socket now listening

हम सर्वर विंडो देखेंगे और प्रवाह को समझेंगे। अब एकाधिक क्लाइंट टर्मिनल खोलें, क्लाइंट थ्रेड चलाएँ

python client_thread1.py
Enter 'quit' to exit
-> Zack
->

दूसरे टर्मिनल में, दूसरा क्लाइंट प्रोग्राम चलाएं और सर्वर टर्मिनल विंडो भी देखें,

python client_thread1.py
Enter 'quit' to exit
-> Python
-> quit

एक और टर्मिनल, क्लाइंट थ्रेड चलाएँ,

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

और हम देख सकते हैं कि हमारी सर्वर विंडो कुछ इस तरह आउटपुट प्रदर्शित करेगी,

Socket created
Socket now listening
Connected with 127.0.0.1:50275
Processing the input received from client
Processed result: Hello ZACK
Connected with 127.0.0.1:50282
Processing the input received from client
Processed result: Hello PYTHON
Processing the input received from client
Client is requesting to quit
Connection 127.0.0.1:50282 closed
Connected with 127.0.0.1:50285
Processing the input received from client
Processed result: Hello WORLD!
Processing the input received from client
Processed result: Hello ANOTHNY

तो थ्रेड एकाधिक सॉकेट कनेक्शन और क्लाइंट को संभालने के लिए सबसे आम तकनीक में से एक प्रदान करते हैं।


  1. विंडोज़ पर पायथन प्रोग्रामिंग के लिए आईडीई

    इस लेख में, हम विंडोज़ के लिए पायथन पर उपलब्ध विभिन्न आईडीई के बारे में जानेंगे। पिचर्म इंटरएक्टिव पायथन कंसोल वेब ढांचे के लिए समर्थन तेज़ अपवर्तन समय कम विकास जुपिटर नोटबुक लगभग हर पायथन मॉड्यूल के साथ संगतता कम जगह और हार्डवेयर आवश्यकताएं इनबिल्ट टर्मिनल और कर्नेल सुविधाएं विज़ेट की एक विस्त

  1. पायथन में मेटाक्लास के साथ मेटा प्रोग्रामिंग

    मेटाप्रोग्रामिंग शब्द कंप्यूटर प्रोग्रामिंग को संदर्भित करता है जहां कंप्यूटर प्रोग्राम हेरफेर करने की कोशिश करते हैं या स्वयं का ज्ञान रखते हैं। पायथन मेटाक्लास नामक एक नए प्रकार के वर्ग के माध्यम से कक्षाओं के लिए मेटाप्रोग्रामिंग का समर्थन करता है। पायथन में मेटाक्लास के माध्यम से मेटा-प्रोग्राम

  1. पायथन में कछुआ प्रोग्रामिंग

    कछुआ अजगर का एक विशेष पंख है। कछुए का उपयोग करके, हम आसानी से एक ड्राइंग बोर्ड बना सकते हैं। पहले हम कछुआ मॉड्यूल आयात करते हैं। फिर एक विंडो बनाएं, आगे हम टर्टल ऑब्जेक्ट बनाते हैं और टर्टल मेथड का उपयोग करके हम ड्रॉइंग बोर्ड में ड्रॉ कर सकते हैं। कुछ कछुआ विधि विधि पैरामीटर विवरण कछुआ () कोई नहीं