ปัญหาที่คุณอธิบายคือสองเท่า
- โปรแกรมที่คุณเขียนกำลังควรประพฤติถ่ายทอดสดเป็นทั้งเมื่อมองจากภายนอก
- ไม่ควรมองเห็นได้ที่ไซต์การโทรว่าการเรียกใช้ฟังก์ชันอาจให้การควบคุมได้หรือไม่
มีสองวิธีในการบรรลุเป้าหมายนี้ แต่โดยทั่วไปแล้วต้มลงไป
- มีหลายกระทู้ (ในระดับที่เป็นนามธรรม)
foo(4, 7, bar, quux)
มีหลายชนิดของฟังก์ชั่นในระดับภาษาซึ่งทั้งหมดนี้จะเรียกว่าเช่นนี้
สำหรับ (1) ฉันกำลังรวบรวมและฟอร์กกระบวนการหลายกระบวนการวางไข่เคอร์เนลหลายเธรดและการประยุกต์ใช้เธรดสีเขียวที่จัดตารางเธรดระดับภาษารันไทม์ลงในเธรดเคอร์เนล จากมุมมองของปัญหาพวกเขาเหมือนกัน ในโลกนี้ฟังก์ชั่นไม่เคยให้ขึ้นหรือสูญเสียการควบคุมจากมุมมองของด้ายที่ ด้ายตัวเองบางครั้งก็ไม่ได้มีการควบคุมและบางครั้งก็ไม่ได้ทำงาน แต่คุณไม่ให้ขึ้นการควบคุมของด้ายของคุณเองในโลกนี้ ระบบที่เหมาะสมกับรุ่นนี้อาจมีหรือไม่มีความสามารถในการวางไข่เธรดใหม่หรือเข้าร่วมในเธรดที่มีอยู่ ระบบที่เหมาะสมรูปแบบนี้อาจจะหรืออาจไม่ได้มีความสามารถในการทำซ้ำด้ายเช่น fork
Unix
(2) น่าสนใจ เพื่อความยุติธรรมเราต้องพูดคุยเกี่ยวกับรูปแบบการแนะนำและการกำจัด
ฉันจะแสดงว่าทำไมawait
ไม่สามารถเพิ่มโดยนัยลงในภาษาเช่น Javascript ด้วยวิธีที่เข้ากันได้ย้อนหลัง แนวคิดพื้นฐานคือการเปิดเผยสัญญากับผู้ใช้และมีความแตกต่างระหว่างบริบทแบบซิงโครนัสและแบบอะซิงโครนัส Javascript ได้รั่วไหลออกมาในรายละเอียดการใช้งานที่ป้องกันการจัดการฟังก์ชันแบบซิงโครนัส นอกจากนี้ยังมีความจริงที่ว่าคุณไม่สามารถawait
สัญญานอกร่างกายของฟังก์ชั่น async ตัวเลือกการออกแบบเหล่านี้ไม่เข้ากันกับ "การทำให้แบบอะซิงโครนัสมองไม่เห็นกับผู้เรียก"
คุณสามารถแนะนำฟังก์ชั่นแบบซิงโครนัสโดยใช้แลมบ์ดาและกำจัดมันด้วยการเรียกใช้ฟังก์ชัน
แนะนำฟังก์ชั่นซิงโคร:
((x) => {return x + x;})
การกำจัดฟังก์ชันซิงโครนัส:
f(4)
((x) => {return x + x;})(4)
คุณสามารถเปรียบเทียบความแตกต่างนี้ได้ด้วยการแนะนำและกำจัดฟังก์ชันอะซิงโครนัส
การแนะนำฟังก์ชั่นแบบอะซิงโครนัส
(async (x) => {return x + x;})
การกำจัดฟังก์ชัน Asynchonrous (หมายเหตุ: ใช้ได้ภายในasync
ฟังก์ชันเท่านั้น)
await (async (x) => {return x + x;})(4)
ปัญหาพื้นฐานที่นี่ก็คือฟังก์ชั่นแบบอะซิงโครนัสก็เป็นฟังก์ชั่นแบบซิงโครนัสที่สร้างวัตถุสัญญาฟังก์ชั่นไม่ตรงกันนอกจากนี้ยังมีฟังก์ชั่นซิงโครการผลิตวัตถุสัญญา
นี่คือตัวอย่างของการเรียกใช้ฟังก์ชั่นอะซิงโครนัสในแบบจำลอง node.js
> (async (x) => {return x + x;})(4)
Promise { 8 }
คุณสามารถสันนิษฐานได้ว่าเป็นภาษาแม้แต่ภาษาที่พิมพ์แบบไดนามิกซึ่งความแตกต่างระหว่างการเรียกฟังก์ชันแบบอะซิงโครนัสและซิงโครนัสไม่สามารถมองเห็นได้ที่ไซต์การโทรและอาจไม่สามารถมองเห็นได้ที่ไซต์คำจำกัดความ
การใช้ภาษาอย่างนั้นและการลดลงสู่ Javascript นั้นเป็นไปได้คุณเพียงแค่ต้องทำให้ทุกฟังก์ชั่นไม่ตรงกัน