कुछ दिन पहले मैं पर एक प्रश्न पूछा गया है तो मेरे कई HTTP की संरचना के लिए एक प्रतिमान डिजाइन की मदद करने के बारे में अनुरोध करता हैप्रवाह मतभेद जब coroutines का उपयोग कर बनाम सूत्रण
यहाँ परिदृश्य है। मैं एक बहु उत्पादक, बहु उपभोक्ता प्रणाली चाहते हैं। मेरे निर्माता कुछ साइटों को क्रॉल और स्क्रैप करते हैं और लिंक को जोड़ते हैं जो इसे कतार में पाता है। चूंकि मैं कई साइटों को क्रॉल कर दूंगा, इसलिए मैं कई उत्पादक/क्रॉलर रखना चाहता हूं।
उपभोक्ता/कर्मचारी इस कतार को खिलाते हैं, इन लिंक के लिए टीसीपी/यूडीपी अनुरोध करते हैं और परिणाम मेरे Django डीबी में सहेजते हैं। मैं कई श्रमिकों को भी पसंद करूंगा क्योंकि प्रत्येक कतार वस्तु एक दूसरे से पूरी तरह से स्वतंत्र है।
लोगों ने सुझाव दिया कि इस यानी गेवेन्ट या इवेंटलेट के लिए कोरआउट लाइब्रेरी का उपयोग करें। कोरआउटिन के साथ कभी काम नहीं करने के बाद, मैंने पढ़ा कि प्रोग्रामिंग प्रतिमान थ्रेडेड प्रतिमानों के समान है, फिर भी केवल एक थ्रेड सक्रिय रूप से निष्पादित होता है लेकिन कॉल अवरुद्ध होने पर - जैसे I/O कॉल - स्टैक्स को स्मृति में बदल दिया जाता है और अन्य हरा थ्रेड तब तक ले जाता है जब तक कि यह किसी अवरुद्ध I/O कॉल का सामना नहीं करता है। उम्मीद है कि मुझे यह अधिकार मिला है? यहाँ मेरी अतः पदों में से एक से कोड है:
import gevent
from gevent.queue import *
import time
import random
q = JoinableQueue()
workers = []
producers = []
def do_work(wid, value):
gevent.sleep(random.randint(0,2))
print 'Task', value, 'done', wid
def worker(wid):
while True:
item = q.get()
try:
print "Got item %s" % item
do_work(wid, item)
finally:
print "No more items"
q.task_done()
def producer():
while True:
item = random.randint(1, 11)
if item == 10:
print "Signal Received"
return
else:
print "Added item %s" % item
q.put(item)
for i in range(4):
workers.append(gevent.spawn(worker, random.randint(1, 100000)))
# This doesn't work.
for j in range(2):
producers.append(gevent.spawn(producer))
# Uncommenting this makes this script work.
# producer()
q.join()
यह अच्छा कार्य करता है क्योंकि sleep
कॉल अवरुद्ध कॉल कर रहे हैं और जब एक sleep
घटना होती है, एक और हरे रंग के धागे से अधिक लेता है। अनुक्रमिक निष्पादन से यह बहुत तेज़ है। जैसा कि आप देख सकते हैं, मेरे पास मेरे प्रोग्राम में कोई कोड नहीं है जो जानबूझकर एक थ्रेड के निष्पादन को दूसरे धागे में लाता है। मैं यह देखने में असफल रहा कि यह उपरोक्त परिदृश्य में कैसे फिट बैठता है क्योंकि मैं सभी धागे एक साथ निष्पादित करना चाहता हूं।
सभी ठीक काम करता है, लेकिन मैं प्रवाह है कि मैं का उपयोग कर Gevent/Eventlets मूल क्रमिक रूप से चल रहे प्रोग्राम की तुलना में अधिक है, लेकिन तेजी से क्या असली-थ्रेडिंग का प्रयोग कर प्राप्त किया जा सकता है की तुलना में कम है हासिल कर लिया है लग रहा है।
यदि मैं थ्रेडिंग तंत्र का उपयोग करके अपने कार्यक्रम को फिर से कार्यान्वित करना चाहता था, तो मेरे प्रत्येक उत्पादक और उपभोक्ता एक साथ कोरआउट के अंदर और बाहर ढेर को स्वैप करने की आवश्यकता के बिना काम कर सकते थे।
क्या इसे थ्रेडिंग का उपयोग करके फिर से कार्यान्वित किया जाना चाहिए? क्या मेरा डिजाइन गलत है? मैं coroutines का उपयोग करने के असली लाभ देखने में विफल रहा है।
शायद मेरी अवधारणाएं थोड़ा गंदे हैं लेकिन यह वही है जो मैंने समेट लिया है। मेरे प्रतिमान और अवधारणाओं की कोई भी मदद या स्पष्टीकरण बहुत अच्छा होगा।
धन्यवाद
एकाधिक प्रक्रियाओं का उपयोग क्यों नहीं करते? –
मैं तो मैं इसके ठीक है या नहीं अगर नहीं जानते पेशेवरों और बहु सूत्रण बनाम बहु प्रसंस्करण के विपक्ष पता नहीं है। –
वहाँ "वास्तविक सूत्रण" जैसी कोई चीज नहीं है वैश्विक दुभाषिया लॉक की वजह से सी एक्सटेंशन (या भारी वजन ओएस प्रक्रियाओं) का सहारा के बिना अजगर कार्यक्रमों में (केवल एक वास्तविक ओएस धागा किसी भी समय पर निष्पादित करता है)। –