के लिए साफ कोड जबकि एसिंक्रोनस आईओ (चुनिंदा/पोल/एपोल/क्यूक्यू इत्यादि के साथ गैर-अवरुद्ध वर्णनकर्ता) वेब पर सबसे अधिक दस्तावेज की बात नहीं है, वहां कुछ अच्छे उदाहरण हैं।एसिंक्रोनस आईओ
हालांकि, इन सभी उदाहरणों ने कॉल द्वारा लौटाए गए हैंडल को निर्धारित किया है, बस 'do_some_io(fd)
' स्टब है। वे वास्तव में इस तरह की विधि में वास्तविक एसिंक्रोनस आईओ से सर्वोत्तम तरीके से कैसे पहुंचने की व्याख्या नहीं करते हैं।
ब्लॉकिंग आईओ कोड पढ़ने के लिए बहुत साफ और सीधा है। गैर-अवरुद्ध, एसिंक आईओ दूसरी तरफ, बालों वाली और गन्दा है।
क्या दृष्टिकोण हैं? मजबूत और पठनीय क्या हैं?
void do_some_io(int fd) {
switch(state) {
case STEP1:
... async calls
if(io_would_block)
return;
state = STEP2;
case STEP2:
... more async calls
if(io_would_block)
return;
state = STEP3;
case STEP3:
...
}
}
या शायद (ab) जीसीसी के अभिकलन gotos का उपयोग कर:
#define concatentate(x,y) x##y
#define async_read_xx(var,bytes,line) \
concatentate(jmp,line): \
if(!do_async_read(bytes,&var)) { \
schedule(EPOLLIN); \
jmp_read = &&concatentate(jmp,line); \
return; \
}
// macros for making async code read like sync code
#define async_read(var,bytes) \
async_read_xx(var,bytes,__LINE__)
#define async_resume() \
if(jmp_read) { \
void* target = jmp_read; \
jmp_read = NULL; \
goto *target; \
}
void do_some_io() {
async_resume();
async_read(something,sizeof(something));
async_read(something_else,sizeof(something_else));
}
या शायद सी ++ अपवाद और एक राज्य मशीन है, इसलिए कार्यकर्ता कार्यों बीच में बंद करें/फिर से शुरू बिट, या शायद एक मेज पर ही आधारित ट्रिगर कर सकते हैं राज्य मशीन?
यह काम नहीं करने का तरीका है, यह कैसे बनाए रखने योग्य है कि मैं पीछा कर रहा हूं!
libevent बफ़र घटनाओं रैपर अच्छा लगेगा, , किरकिरा आईओ हैंडलिंग से बचने का एक सुविधाजनक तरीका है; लेकिन आप इस स्थिति को उस कोड में कैसे प्रस्तुत करते हैं जो इसे कॉल करता है जिसे पुन: शुरू किया जाना चाहिए? – Will
संपादित किया गया: एक उदाहरण जोड़ा गया – Artyom
धन्यवाद Artyom, मुझे आशा है कि लोग एपोल को गुगलते हैं और ऐसा पाते हैं! – Will