मैं एक बड़ी फाइल डाउनलोड करना चाहता हूं और साथ ही अन्य चीजों को संभालना चाहता हूं।मैं लुआ पुस्तकालयों से कैसे निपटूं जो coroutine.yield() नहीं है?
हालांकि, luasocket.http
कभी नहीं coroutine.yield()
कहता है। फ़ाइल डाउनलोड करते समय बाकी सब कुछ जम जाता है।
यहाँ एक उदाहराणदर्शक उदाहरण है, जिसमें मैं एक साथ एक फ़ाइल डाउनलोड करने और कुछ संख्या मुद्रित करने के लिए प्रयास करें:
local http = require'socket.http'
local downloadRoutine = coroutine.create(function()
print 'Downloading large file'
-- Download an example file
local url = 'http://ipv4.download.thinkbroadband.com/5MB.zip'
local result, status = http.request(url)
print('FINISHED download ('..status..', '..#result..'bytes)')
end)
local printRoutine = coroutine.create(function()
-- Print some numbers
for i=1,10 do
print(i)
coroutine.yield()
end
print 'FINISHED printing numbers'
end)
repeat
local printActive = coroutine.resume(printRoutine)
local downloadActive = coroutine.resume(downloadRoutine)
until not downloadActive and not printActive
print 'Both done!'
चल रहा है यह इस का उत्पादन:
1
Downloading large file
FINISHED download (200, 5242880bytes)
2
3
4
5
6
7
8
9
10
FINISHED printing numbers
Both done!
आप देख सकते हैं, printRoutine
resume
है डी पहले। यह नंबर 1 और yield
एस प्रिंट करता है। downloadRoutine
तो resume
घ, जो पूरी फ़ाइल डाउनलोड, उपज के बिना है। केवल तभी शेष संख्या मुद्रित हैं।
मैं अपने खुद के सॉकेट पुस्तकालय लिखने के लिए नहीं चाहता! मैं क्या कर सकता हूँ?
संपादित करें (बाद में उसी दिन): कुछ MUSH उपयोगकर्ता have also noticed। वे सहायक विचार प्रदान करते हैं।
कोरआउट्स धागे नहीं हैं। आपको धागे की तरह उनका इलाज नहीं करना चाहिए। यदि कोई प्रक्रिया उपज नहीं करना चाहती है, तो यह नहीं जा रहा है, न ही आप इसे उपज के लिए मजबूर कर सकते हैं। लुआसॉकेट में गैर-अवरुद्ध आईओ के लिए कुछ सुविधाएं हैं, लेकिन मैं लुआसॉकेट से बहुत परिचित नहीं हूं, इसलिए आपको उनकी जांच करनी होगी। –
लुआसॉकेट एसिंक्रोनस (यानी गैर-अवरुद्ध) संचालन का समर्थन करता है। लाइब्रेरी को फिर से लिखने से पहले आरटीएफएम। – Mud
मिड: हाँ, कच्चे 'सॉकेट 'करता है। लेकिन 'socket.http' नहीं है। (देखें http://www.mail-archive.com/[email protected]/msg04969.html।) – Anko