सबसे पहले, मेरी बुरी अंग्रेजी के लिए खेद है। मेरी परियोजना में मेरे पास बहुत सारे I/O नेटवर्क अनुरोध हैं। मुख्य डेटा किसी अन्य प्रोजेक्ट में संग्रहीत किया जाता है, और एक्सेस वेब एपीआई (जेएसओएन/एक्सएमएल), मतदान द्वारा प्रदान किया जाता है। हम प्रत्येक एपीआई सत्र (उपयोगकर्ता के बारे में जानकारी प्राप्त करने) के लिए इस एपीआई का उपयोग करते हैं। और कभी-कभी, हमें प्रतिक्रिया की प्रतीक्षा करने में समस्या होती है। हम nginx + uwsgi + django का उपयोग करते हैं। जैसा कि आप जानते हैं, Django तुल्यकालिक (या अवरुद्ध) है। हम नेटवर्क IO प्रतीक्षा के साथ हल समस्या के लिए multithreading के साथ uwsgi का उपयोग करते हैं। मैंने भूगर्भ के बारे में पढ़ने का फैसला किया। मैं सहकारी और प्रीपेप्टिव मल्टीटास्किंग के बीच अंतर को समझता हूं। और मुझे उम्मीद थी कि इस मुद्दे के लिए यूवेस्गी धागे बेहतर होगा (नेटवर्क I/O बाधा)। लेकिन परिणाम लगभग समान थे। कभी-कभी gevent कमजोर था। शायद कहीं मैं गलत हूं। कृपया मुझे बताओ।गीवेन्ट बनाम धागे के साथ Uwsgi
यहां uwsgi कॉन्फ़िगरेशन उदाहरण हैं। Gevent:
$ uwsgi --http :8001 --module ugtest.wsgi --gevent 40 --gevent-monkey-patch
थ्रेडिंग:
$ uwsgi --http :8001 --module ugtest.wsgi --enable-threads --threads 40
नियंत्रक उदाहरण:
def simple_test_action(request):
# get data from API without parsing (only for simple I/O test)
data = _get_data_by_url(API_URL)
return JsonResponse(data, safe=False)
import httplib
from urlparse import urlparse
def _get_data_by_url(url):
u = urlparse(url)
if str(u.scheme).strip().lower() == 'https':
conn = httplib.HTTPSConnection(u.netloc)
else:
conn = httplib.HTTPConnection(u.netloc)
path_with_params = '%s?%s' % (u.path, u.query,)
conn.request("GET", path_with_params)
resp = conn.getresponse()
print resp.status, resp.reason
body = resp.read()
return body
टेस्ट (geventhttpclient के साथ):
def get_info(i):
url = URL('http://localhost:8001/simpletestaction/')
http = HTTPClient.from_url(url, concurrency=100, connection_timeout=60, network_timeout=60)
try:
response = http.get(url.request_uri)
s = response.status_code
body = response.read()
finally:
http.close()
dt_start = dt.now()
print 'Start: %s' % dt_start
threads = [gevent.spawn(get_info, i) for i in xrange(401)]
gevent.joinall(threads)
dt_end = dt.now()
print 'End: %s' % dt_end
print dt_end-dt_start
दोनों मामलों में मेरे पास एक समान समय है। एक समान मुद्दे (एपीआई प्रॉक्सीइंग) में एक gevent/greenlets और सहकारी मल्टीटास्किंग के फायदे क्या हैं?
मैं इसे अन्य धागे/ग्रीनलेट्स के साथ परीक्षण करने की कोशिश कर रहा हूं। हजारों नहीं, लेकिन सैकड़ों। और परिणाम समान है। मुझे लगता है कि अगर मेरे नियंत्रक कार्रवाई में एक से अधिक अनुरोध हैं (जॉइन()/joinall() का उपयोग कर, तो gevent सबसे अच्छा विकल्प है। लेकिन मेरे मुद्दे में ("प्रॉक्सी" -एपीआई) मेरे पास महत्वपूर्ण लाभ नहीं हैं। पहले मामले (धागे) में हमारे पास एक साधारण कॉन्फ़िगरेशन है: - थ्रेड एन दूसरे मामले में (गीवेंट) हमें पोस्टग्रेस ड्राइवर (उदाहरण के लिए), रेडिस इत्यादि पैचिंग के साथ बहुत सी समस्या है। इसके अलावा, हमारे पास है पूर्ण स्टैक ट्रेस के साथ एक समस्या ... – OLMER
क्षमा करें, आप का पालन करना सुनिश्चित नहीं है, अगर आप django "पैच" नहीं कर सकते हैं, तो आप gevent का उपयोग नहीं कर सकते हैं। आपका ऐप 100% गैर-अवरुद्ध होना चाहिए, अन्यथा यह एक अवरुद्ध ऐप है और गीवेंट आपकी मदद नहीं करेगा (ठीक है, यह भी सबसे खराब होगा) – roberto