คำถามติดแท็ก async

5
แนวทางของ async / ไม่ใช้งานการรอคอยใน C # ขัดแย้งกับแนวคิดของสถาปัตยกรรมที่ดีและการฝังรากลึกนามธรรม?
คำถามนี้เกี่ยวกับภาษา C # แต่ฉันคาดหวังให้ครอบคลุมภาษาอื่นเช่น Java หรือ TypeScript Microsoft แนะนำแนวทางปฏิบัติที่ดีที่สุดในการใช้การโทรแบบอะซิงโครนัสใน. NET ในบรรดาคำแนะนำเหล่านี้เรามาเลือกสองข้อ: เปลี่ยนลายเซ็นของเมธอด async เพื่อให้ส่งคืนงานหรืองาน <> (ใน TypeScript นั่นจะเป็นสัญญา <>) เปลี่ยนชื่อของวิธีการ async เป็นลงท้ายด้วย xxxAsync () ตอนนี้เมื่อแทนที่ส่วนประกอบที่มีระดับต่ำและซิงโครนัสด้วยอะซิงก์หนึ่งสิ่งนี้จะส่งผลกระทบต่อสแต็กเต็มของแอปพลิเคชัน เนื่องจาก async / await มีผลกระทบเชิงบวกต่อเมื่อใช้ "all-up up" เท่านั้นนั่นหมายถึงชื่อลายเซ็นและเมธอดของทุกเลเยอร์ในแอปพลิเคชันจะต้องเปลี่ยน สถาปัตยกรรมที่ดีมักจะเกี่ยวข้องกับการวาง abstractions ระหว่างแต่ละเลเยอร์เช่นการแทนที่ส่วนประกอบระดับต่ำโดยผู้อื่นจะมองไม่เห็นโดยส่วนประกอบระดับบน ใน C # abstractions จะอยู่ในรูปของอินเตอร์เฟส หากเราแนะนำส่วนประกอบ async ใหม่ระดับต่ำและต่ำแต่ละอินเตอร์เฟสใน call stack จำเป็นต้องได้รับการแก้ไขหรือแทนที่ด้วยอินเตอร์เฟสใหม่ วิธีการแก้ไขปัญหา (async หรือ …
103 c#  architecture  async 

5
การเขียนโปรแกรมแบบอะซิงโครนัสในภาษาเชิงหน้าที่
ฉันส่วนใหญ่เป็นโปรแกรมเมอร์ C / C ++ ซึ่งหมายความว่าประสบการณ์ส่วนใหญ่ของฉันอยู่กับกระบวนทัศน์เชิงกระบวนทัศน์และเชิงวัตถุ อย่างไรก็ตามในขณะที่โปรแกรมเมอร์ C ++ หลายคนตระหนักดี C ++ ได้เปลี่ยนการเน้นในช่วงหลายปีที่ผ่านมาเป็นรูปแบบการใช้งานแบบเอสคิว ไม่ว่าในขณะที่ฉันมีประสบการณ์การเขียนโค้ดในรูปแบบการทำงานโดยใช้ C ++ ฉันมีประสบการณ์น้อยมากกับภาษาที่ใช้งานได้จริงเช่น Lisp, Haskell เป็นต้น ฉันเพิ่งเริ่มศึกษาภาษาเหล่านี้เนื่องจากความคิดที่ว่า "ไม่มีผลข้างเคียง" ในภาษาที่ใช้งานได้ล้วนทำให้ฉันทึ่งเสมอโดยเฉพาะอย่างยิ่งเกี่ยวกับแอพพลิเคชั่นของมันในการทำงานพร้อมกันและการคำนวณแบบกระจาย อย่างไรก็ตามมาจากพื้นหลัง C ++ ฉันสับสนว่า philsophy "ไม่มีผลข้างเคียง" นี้ทำงานร่วมกับการเขียนโปรแกรมแบบอะซิงโครนัสได้อย่างไร โดยการเขียนโปรแกรมแบบอะซิงโครนัสฉันหมายถึงเฟรมเวิร์ก / API / รูปแบบการเข้ารหัสที่ให้ผู้ใช้จัดการเหตุการณ์เพื่อจัดการเหตุการณ์ที่เกิดขึ้นแบบอะซิงโครนัส (นอกกระแสของโปรแกรม) ซึ่งรวมถึงไลบรารีแบบอะซิงโคร ตัวจัดการสัญญาณหรือตัวจัดการเหตุการณ์ Java GUI สิ่งหนึ่งที่สิ่งเหล่านี้มีเหมือนกันคือธรรมชาติของการเขียนโปรแกรมแบบอะซิงโครนัสดูเหมือนจะต้องการการสร้างผลข้างเคียง (สถานะ) เพื่อให้กระแสหลักของโปรแกรมตระหนักว่ามีการเรียกใช้ตัวจัดการเหตุการณ์แบบอะซิงโครนัส โดยทั่วไปในเฟรมเวิร์กเช่น Boost.ASIO ตัวจัดการเหตุการณ์จะเปลี่ยนสถานะของวัตถุเพื่อให้เอฟเฟกต์ของเหตุการณ์นั้นแพร่กระจายเกินเวลาชีวิตของฟังก์ชันตัวจัดการเหตุการณ์ จริงๆแล้วตัวจัดการเหตุการณ์สามารถทำอะไรได้อีก? ไม่สามารถ "ส่งคืน" ค่าไปยังจุดโทรได้เนื่องจากไม่มีจุดโทร …

4
อะไรเป็นตัวกำหนดว่าฟังก์ชั่น Javascript ใดบ้างที่ถูกบล็อกเทียบกับการไม่บล็อก?
ฉันได้ทำ Javascript บนเว็บ (วานิลลา JS, jQuery, Backbone ฯลฯ ) มาหลายปีแล้วและเมื่อไม่นานมานี้ฉันได้ทำงานกับ Node.js ฉันใช้เวลาสักครู่เพื่อหยุดการเขียนโปรแกรม "non-blocking" แต่ตอนนี้ฉันคุ้นเคยกับการใช้ callback สำหรับการดำเนินการ IO และอะไรก็ตาม ฉันเข้าใจว่า Javascript นั้นเป็นเธรดเดียวโดยธรรมชาติ ฉันเข้าใจแนวคิดของโหนด "คิวเหตุการณ์" สิ่งที่ฉันไม่เข้าใจคือสิ่งที่กำหนดว่าการดำเนินการจาวาสคริปต์แต่ละรายการนั้นคือ "การบล็อก" กับ "การไม่บล็อก" ฉันจะทราบได้อย่างไรว่าการดำเนินการใดที่ฉันสามารถพึ่งพาเพื่อสร้างเอาต์พุตแบบซิงโครนัสสำหรับฉันที่จะใช้ในโค้ดในภายหลังและอันไหนที่ฉันจะต้องผ่านการเรียกกลับเพื่อให้ฉันสามารถประมวลผลเอาท์พุทได้ มีรายการฟังก์ชั่น Javascript ที่อื่นที่ไม่ตรงกัน / ไม่บล็อกและรายการของฟังก์ชันที่ซิงโครนัส / บล็อกหรือไม่ อะไรที่ทำให้แอพ Javascript ของฉันไม่เป็นหนึ่งในการแข่งขันที่ยิ่งใหญ่ ฉันรู้ว่าการดำเนินการที่ใช้เวลานานเช่นการปฏิบัติการ IO ในการดำเนินงาน Node และ AJAX บนเว็บต้องการให้มีการแบบอะซิงโครนัสดังนั้นจึงใช้การเรียกกลับ - แต่ใครจะพิจารณาว่าคุณสมบัติใดเป็น "เวลานาน"? มีการจัดเรียงของทริกเกอร์ภายในการดำเนินการเหล่านี้ที่ลบออกจาก "คิวเหตุการณ์" …

6
ทำไมคุณจะ 'รอ' วิธีการแล้วถามค่าส่งคืนทันที
ในบทความ MSDN นี้มีการให้รหัสตัวอย่างต่อไปนี้ (แก้ไขเล็กน้อยเพื่อความกะทัดรัด): public async Task<ActionResult> Details(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } Department department = await db.Departments.FindAsync(id); if (department == null) { return HttpNotFound(); } return View(department); } FindAsyncวิธีการดึงDepartmentวัตถุโดยใช้ ID Task<Department>ของตนและผลตอบแทน จากนั้นแผนกจะถูกตรวจสอบทันทีเพื่อดูว่าเป็นโมฆะหรือไม่ ตามที่ฉันเข้าใจแล้วการขอค่าของภารกิจในลักษณะนี้จะบล็อกการเรียกใช้โค้ดจนกว่าจะส่งคืนค่าจากเมธอดที่รอคอยซึ่งส่งคืนการโทรแบบซิงโครนัสอย่างมีประสิทธิภาพ ทำไมคุณถึงทำเช่นนี้? มันจะง่ายกว่าFind(id)ไหมถ้าจะเรียกวิธีการซิงโครนัสถ้าคุณจะบล็อกทันทีล่ะ?
24 c#  .net  asp.net-mvc  async 

3
ฉันจะวินิจฉัย async / รอคอยการหยุดชะงักได้อย่างไร
ฉันกำลังทำงานกับ codebase ใหม่ที่ใช้ async / await อย่างหนัก คนส่วนใหญ่ในทีมของฉันก็ค่อนข้างใหม่สำหรับ async / คอย โดยทั่วไปเรามักจะยึดถือแนวทางปฏิบัติที่ดีที่สุดตามที่ระบุไว้โดย Microsoftแต่โดยทั่วไปต้องการบริบทของเราที่จะไหลผ่านการเรียกใช้ async และทำงานกับไลบรารีที่ไม่ConfigureAwait(false)ต้องการ รวมทุกสิ่งเหล่านั้นเข้าด้วยกันและเราพบ aslock deadlock ที่อธิบายไว้ในบทความ ... ทุกสัปดาห์ พวกเขาจะไม่ปรากฏขึ้นในระหว่างการทดสอบหน่วยเพราะแหล่งข้อมูลของเราเยาะเย้ย (มักจะผ่านTask.FromResult) ไม่เพียงพอที่จะเรียกการหยุดชะงัก ดังนั้นในระหว่างการทดสอบรันไทม์หรือการรวมการบริการบางอย่างเพิ่งออกไปทานอาหารกลางวันและไม่ส่งคืน นั่นจะฆ่าเซิร์ฟเวอร์และโดยทั่วไปก็ทำสิ่งต่าง ๆ เป็นระเบียบ ปัญหาคือการติดตามจุดที่เกิดข้อผิดพลาด (โดยปกติแล้วจะไม่เป็นแบบซิงค์ตลอดเวลา) โดยทั่วไปแล้วจะเกี่ยวข้องกับการตรวจสอบรหัสด้วยตนเองซึ่งใช้เวลานานและไม่สามารถใช้งานได้โดยอัตโนมัติ วิธีที่ดีกว่าในการวินิจฉัยสิ่งที่ทำให้เกิดการหยุดชะงักคืออะไร
24 c#  debugging  async 

5
จุดใดที่การอ่านแบบอะซิงโครนัสของดิสก์ I / O มีประสิทธิภาพมากกว่าแบบซิงโครนัส
สมมติว่ามีโค้ดบางส่วนที่อ่านไฟล์สำหรับผู้ใช้หลายคนและไฟล์มีขนาดใดก็ได้: ขนาดใดที่มีประสิทธิภาพมากขึ้นในการอ่านไฟล์แบบอะซิงโครนัส? หรือจะพูดอีกวิธีหนึ่งไฟล์ต้องมีขนาดเล็กแค่ไหนเพื่อให้อ่านได้เร็วขึ้น? ฉันสังเกตเห็น (และบางทีฉันไม่ถูกต้อง) ว่าเมื่ออ่านไฟล์ที่มีขนาดเล็กมากมันใช้เวลานานในการอ่านแบบอะซิงโครนัสมากกว่าแบบซิงโครนัส (โดยเฉพาะกับ. NET) ฉันสมมติว่าสิ่งนี้เกี่ยวข้องกับการตั้งค่าเวลาสำหรับสิ่งต่างๆเช่นพอร์ต I / O Completion Port, เธรดและอื่น ๆ มีกฎง่ายๆที่จะช่วยออกที่นี่? หรือมันขึ้นอยู่กับระบบและสิ่งแวดล้อม?
22 efficiency  async  io 

2
ใครทำ async / รอก่อน
Python เพิ่ม async / await constructs ใน 3.5 ในปี 2015 ชุมชน Javascript ได้ทำตามขั้นตอนมาเป็นเวลากว่าพันล้านปีและในที่สุดก็เพิ่มการใช้งานที่คล้ายกันมากกับร่างใน ES8 ที่เปิดตัวในปี 2017 (จากความเข้าใจของฉัน) typescript ยังเพิ่มวิธีการ async ในปี 2015 ในรุ่น 1.7 ที่ดวงตาที่ไม่ได้รับการฝึกฝนดูเหมือนว่าวิธี js async C # วิธีการเพิ่ม async ในปี 2012 ที่ดูเหมือนว่าการใช้งานอื่น ๆ ของ async / await และขึ้นอยู่กับการทำงานที่คล้ายกันของ F # แต่เวิร์กโฟลว์แบบอะซิงโครนัสที่ดูแตกต่างกันซึ่งถูกนำมาใช้ใน F # 2.0 ในปี 2010 นี่เป็นตัวอย่างแรกสุด - …

3
การเรียกใช้บริการ async หลายตัวพร้อมกัน
ฉันมีบริการ async REST ไม่กี่รายการซึ่งไม่ได้ขึ้นอยู่กับกันและกัน นั่นคือในขณะที่ "รอ" คำตอบจาก Service1 ฉันสามารถโทร Service2, Service3 และอื่น ๆ ตัวอย่างเช่นอ้างถึงรหัสด้านล่าง: var service1Response = await HttpService1Async(); var service2Response = await HttpService2Async(); // Use service1Response and service2Response ตอนนี้service2Responseไม่ได้ขึ้นอยู่กับservice1Responseพวกเขาและสามารถดึงข้อมูลได้อย่างอิสระ ดังนั้นฉันไม่จำเป็นต้องรอการตอบรับจากบริการแรกเพื่อเรียกบริการที่สอง ฉันไม่คิดว่าฉันสามารถใช้Parallel.ForEachที่นี่ได้เนื่องจากไม่ใช่การทำงานของ CPU bound ในการเรียกการดำเนินการสองอย่างนี้แบบขนานฉันสามารถใช้งานได้Task.WhenAllไหม ปัญหาหนึ่งที่ฉันเห็นการใช้Task.WhenAllคือมันไม่ส่งคืนผลลัพธ์ ในการรับผลลัพธ์ฉันสามารถโทรtask.ResultหลังจากโทรTask.WhenAllได้เนื่องจากงานทั้งหมดเสร็จสมบูรณ์แล้วและสิ่งที่ฉันต้องใช้ในการตอบกลับคืออะไร? รหัสตัวอย่าง: var task1 = HttpService1Async(); var task2 = HttpService2Async(); await Task.WhenAll(task1, task2) var …

2
เหตุใด C # ช่วยให้คุณสามารถแทนที่ async ได้
ใน C # เมื่อคุณแทนที่เมธอดจะอนุญาตให้ทำการแทนที่ async เมื่อไม่ได้ใช้วิธีดั้งเดิม ดูเหมือนว่ารูปแบบไม่ดี ตัวอย่างที่นำฉันมาสู่สิ่งนี้คือสิ่งนี้ - ฉันถูกนำตัวเข้ามาเพื่อช่วยแก้ไขปัญหาการทดสอบโหลด มีผู้ใช้งานพร้อมกันประมาณ 500 คนกระบวนการเข้าสู่ระบบจะแยกย่อยในการวนรอบการเปลี่ยนเส้นทาง IIS กำลังบันทึกข้อยกเว้นด้วยข้อความ "โมดูลหรือตัวจัดการแบบอะซิงโครนัสเสร็จสมบูรณ์ในขณะที่การดำเนินการแบบอะซิงโครนัสยังคงค้างอยู่" การค้นหาบางอย่างทำให้ฉันคิดว่ามีใครบางคนกำลังดูถูกเหยียดหยามasync voidแต่การค้นหาอย่างรวดเร็วของฉันผ่านทางแหล่งข้อมูลไม่พบสิ่งใดเลย น่าเศร้าที่ฉันกำลังค้นหา 'async \ svoid' (การค้นหา regex) เมื่อฉันควรมองหาบางสิ่งเพิ่มเติมเช่น 'async \ s [^ T]' (สมมติว่า Task ไม่ผ่านการรับรอง ... คุณเข้าใจแล้ว) สิ่งที่ฉันพบภายหลังคือasync override void onActionExecuting(...ตัวควบคุมพื้นฐาน เห็นได้ชัดว่าจะต้องมีปัญหาและมันก็เป็น แก้ไขปัญหาที่เกิดขึ้น (ทำให้ซิงโครนัสสักครู่) แก้ไขปัญหา กลับไปที่คำถาม: ทำไมโอทำไมคุณสามารถทำเครื่องหมาย override เป็น async เมื่อรหัสการโทรไม่สามารถรอได้?
16 c#  async 

3
BackgroundWorker vs. Async / Await
ฉันยังใหม่กับการพัฒนา C # และต้องการสร้าง UI ที่ตอบสนองได้ดีขึ้น ในการวิจัยเบื้องต้นของฉันฉันเห็นสองวิธีในการบรรลุเป้าหมายนี้: มัลติเธรดร่วมกับคลาส BackgroundWorker ตัวดัดแปลง Async / Await ที่ใหม่กว่า ใหม่กว่าหมายความว่าดีกว่า ความแตกต่างระหว่างสองวิธีคืออะไร หากฉันต้องการสร้างโครงการใหม่ฉันจะเลือกวิธีที่จะไปด้วยได้อย่างไร แก้ไข: บางทีฉันควรระบุ ฉันกำลังสร้างแอปพลิเคชัน Windows Forms ซึ่งข้อมูลที่จำเป็นทั้งหมดจะถูกบันทึก / โหลดบนดิสก์ภายในเครื่อง ฉันจะสื่อสารกับอุปกรณ์ USB หลายแห่งด้วย

3
Async C # 5 จะสนับสนุนปัญหาการซิงโครไนซ์เธรด UI อย่างไร
ฉันได้ยินบางที่ Cync ที่รอคอย async จะยอดเยี่ยมมากจนคุณไม่ต้องกังวลเกี่ยวกับการทำเช่นนี้: if (InvokeRequired) { BeginInvoke(...); return; } // do your stuff here ดูเหมือนว่าการเรียกกลับของการดำเนินการที่รอจะเกิดขึ้นในเธรดต้นฉบับของผู้โทร มีการระบุไว้หลายครั้งโดย Eric Lippert และ Anders Hejlsberg ว่าคุณลักษณะนี้มีต้นกำเนิดมาจากความต้องการที่จะทำให้ UIs (โดยเฉพาะ UIs อุปกรณ์สัมผัส) ตอบสนองได้ดียิ่งขึ้น ฉันคิดว่าการใช้คุณสมบัติทั่วไปเช่นนี้จะเป็นดังนี้: public class Form1 : Form { // ... async void GetFurtherInfo() { var temperature = await GetCurrentTemperatureAsync(); label1.Text = temperature; …

6
วิธีแก้ปัญหาการเข้าใช้ใหม่แบบ Async C # 5
ดังนั้นมีบางอย่างเกี่ยวกับฉันที่สนับสนุน async ใหม่ใน C # 5: ผู้ใช้กดปุ่มที่เริ่มการทำงานของ async การโทรจะส่งกลับทันทีและปั๊มข้อความเริ่มทำงานอีกครั้งนั่นคือจุดรวม ดังนั้นผู้ใช้สามารถกดปุ่มอีกครั้ง - ก่อให้เกิดความเชื่อมั่นอีกครั้ง เกิดอะไรขึ้นถ้านี่เป็นปัญหา ในตัวอย่างที่ฉันได้เห็นพวกเขาจะปิดใช้งานปุ่มก่อนการawaitโทรและเปิดใช้งานอีกครั้งหลังจากนั้น ดูเหมือนว่าฉันจะเป็นทางออกที่เปราะบางมากในแอปที่ใช้งานจริง เราควรเขียนรหัสสถานะเครื่องจักรบางอย่างที่ระบุว่าต้องปิดการใช้งานการควบคุมใดสำหรับชุดการทำงานที่กำหนดไว้ หรือมีวิธีที่ดีกว่า ฉันอยากที่จะแสดงกล่องโต้ตอบเป็นกิริยาช่วยในช่วงระยะเวลาของการดำเนินการ แต่นี่รู้สึกเหมือนใช้ค้อนขนาดใหญ่ มีใครมีความคิดที่สดใสบ้างไหม แก้ไข: ฉันคิดว่าการปิดใช้งานการควบคุมที่ไม่ควรใช้ในขณะที่การดำเนินการกำลังทำงานอยู่มีความเปราะบางเพราะฉันคิดว่ามันจะซับซ้อนอย่างรวดเร็วเมื่อคุณมีหน้าต่างที่มีการควบคุมมากมาย ฉันชอบที่จะทำให้สิ่งต่าง ๆ เรียบง่ายเพราะมันช่วยลดโอกาสในการเกิดข้อบกพร่องทั้งในระหว่างการเข้ารหัสเริ่มต้นและการบำรุงรักษาที่ตามมา จะเกิดอะไรขึ้นถ้ามีชุดควบคุมที่ควรปิดใช้งานสำหรับการดำเนินการเฉพาะอย่าง และจะเกิดอะไรขึ้นถ้าการทำงานหลายอย่างทำงานพร้อมกัน?

1
NodeJS จะ“ ไม่ปิดกั้น” ได้อย่างไร?
ฉันกำลังเรียนรู้ NodeJS และแค่ต้องการชี้แจงบางอย่าง ในแบบฝึกหัดเบื้องต้นและหนังสือหลายเล่มจนถึงตอนต้นพวกเขาได้อธิบายสถาปัตยกรรม "ไม่บล็อก" ของโหนดหรือค่อนข้างเป็นไปได้ (และแนะนำทั้งจุด) เป็นรหัสในลักษณะที่ไม่ปิดกั้น ตัวอย่างเช่นตัวอย่างนี้มีให้ในหนังสือที่ฉันกำลังอ่านวิธีอะซิงโครนัสเพื่อรับข้อมูลจากฐานข้อมูล http.createServer(function (req, res) { database.getInformation(function (data) { res.writeHead(200); res.end(data); }); }); เกิดอะไรขึ้น (ตามที่ฉันเข้าใจ) คือโหนดทำให้การเรียกไปยังฐานข้อมูลจากนั้นดำเนินการสิ่งที่อาจเกิดขึ้นต่อไปในสแต็คการโทร เมื่อการร้องขอฐานข้อมูลเสร็จสมบูรณ์ตัวแปรข้อมูลในฟังก์ชั่นการโทรกลับที่ไม่ระบุชื่อจะถูกเติมและฟังก์ชั่นนั้นจะถูกเพิ่มเข้าไปในสแต็คการโทร (และดำเนินการในภายหลังเมื่อโหนดเข้าสู่มัน) คำถามของฉันคือการประมวลผลการร้องขอฐานข้อมูลคืออะไร? แน่นอนโหนดต้องปิดกั้นในขณะที่มันทำอย่างนั้น? การดูแลคำขอฐานข้อมูลคืออะไร หรือถ้าโหนดกำลังรอการร้องขอ HTTP GET แบบอะซิงโครนัสไปยังทรัพยากรภายนอกสิ่งที่ดูแลคำขอนั้นที่อนุญาตให้โหนดประมวลผลสแต็กการโทรต่อและเป็น "non-blocking"

2
เมื่อใดที่ฉันควรใช้ StringBuilder หรือ StringBuffer
ในเว็บแอปพลิเคชั่นการผลิตโปรแกรมเมอร์เพื่อนของฉันใช้ StringBuffer ทุกที่ ตอนนี้ฉันกำลังดูแลการพัฒนาแอพพลิเคชั่นและการแก้ไข หลังจากอ่านStringBuilderและStringBufferฉันได้ตัดสินใจเปลี่ยนรหัส StringBuffer ทั้งหมดด้วย StringBuilder เพราะเราไม่ต้องการความปลอดภัยของเธรดใน data beans ของเรา ตัวอย่างเช่น: (ในแต่ละ data bean ฉันสามารถเห็นการใช้งานของ StringBuffer) @Override public String toString() { StringBuffer sb = new StringBuffer();// replace it from StringBuilder sb.append(" ABCD : ").append(abcd); sb.append(", EFGH : ").append(efgh); sb.append(", IJKL : ").append(ijkl); } เราสร้าง data beans แยกต่างหากสำหรับแต่ละเซสชั่น / …

2
การเตรียมพร้อมกับการใช้หน่วยความจำ Async IO เสร็จสมบูรณ์หรือไม่
ฉันกำลังดูการสนทนานี้เกี่ยวกับการใช้ Async IO ใน Rust และ Carl กล่าวถึงแบบจำลองที่มีศักยภาพสองแบบ ความพร้อมและความสำเร็จ โมเดลความพร้อม: คุณบอกเคอร์เนลที่คุณต้องการอ่านจากซ็อกเก็ต ทำสิ่งอื่นเพื่อสักครู่ ... เคอร์เนลจะบอกคุณเมื่อซ็อกเก็ตพร้อม คุณอ่าน (เติมบัฟเฟอร์) ทำสิ่งที่คุณต้องการ ฟรีบัฟเฟอร์ (เกิดขึ้นโดยอัตโนมัติด้วยสนิม) เสร็จสิ้นรูปแบบ: คุณจัดสรรบัฟเฟอร์เพื่อให้เคอร์เนลเติม ทำสิ่งอื่นเพื่อสักครู่ ... เคอร์เนลจะบอกคุณเมื่อบัฟเฟอร์เต็ม ทำสิ่งที่คุณต้องการด้วยข้อมูล ฟรีบัฟเฟอร์ คาร์ลในตัวอย่างของการใช้รูปแบบการเตรียมความพร้อมที่คุณสามารถย้ำกว่าซ็อกเก็ตพร้อมเติมและพ้นบัฟเฟอร์ทั่วโลกซึ่งจะทำให้มันดูเหมือนมันจะใช้มากหน่วยความจำน้อย ตอนนี้สมมติฐานของฉัน: ภายใต้ประทุน (ในพื้นที่เคอร์เนล) เมื่อซ็อกเก็ตถูกกล่าวว่าเป็น "พร้อม" ข้อมูลมีอยู่แล้ว มันเข้ามาในซ็อกเก็ตผ่านเครือข่าย (หรือจากที่ใดก็ได้) และระบบปฏิบัติการนั้นก็เก็บข้อมูลไว้ มันไม่เหมือนกับว่าการจัดสรรหน่วยความจำอย่างน่าอัศจรรย์ไม่ได้เกิดขึ้นในโมเดลความพร้อม มันเป็นเพียงแค่ระบบปฏิบัติการที่เป็นนามธรรมจากคุณ ในรูปแบบเสร็จสมบูรณ์ระบบปฏิบัติการจะขอให้คุณจัดสรรหน่วยความจำก่อนที่ข้อมูลจะไหลเข้ามาและเห็นได้ชัดว่าเกิดอะไรขึ้น นี่คือโมเดลการเตรียมพร้อมในการแก้ไขของฉัน: คุณบอกเคอร์เนลที่คุณต้องการอ่านจากซ็อกเก็ต ทำสิ่งอื่นเพื่อสักครู่ ... การแก้ไข: ข้อมูลเข้าสู่ระบบปฏิบัติการ (บางที่ในหน่วยความจำเคอร์เนล) เคอร์เนลบอกคุณซ็อกเก็ตพร้อม คุณอ่าน (กรอกบัฟเฟอร์อื่นแยกต่างหากจากบัฟเฟอร์เคอร์เนลในต่างประเทศ (หรือคุณได้รับตัวชี้ไป?)) …
12 async  io 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.