3 คะแนน โดย GN⁺ 2024-04-03 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

ผสานรวม Python เข้ากับ Cloudflare Workers: ใช้ Pyodide และ WebAssembly

  • ตอนนี้สามารถใช้ Python บน Cloudflare Workers ได้แล้ว
  • ต่างจากการรองรับภาษาอื่นนอกเหนือจาก JavaScript ก่อนหน้านี้ โดยตัวรัน Python ถูกผสานรวมเข้ากับรันไทม์ workerd โดยตรง
  • รองรับ binding ทั้งหมด เช่น Vectorize, Workers AI, R2 และ Durable Objects
  • สามารถนำเข้าแพ็กเกจ Python ยอดนิยมบางส่วน เช่น FastAPI, Langchain และ Numpy ได้
  • ไม่จำเป็นต้องมีขั้นตอน build แยกต่างหากหรือทูลเชนภายนอก

มากกว่าการคอมไพล์เป็น WebAssembly

  • Cloudflare Workers รองรับ WebAssembly มาตั้งแต่ปี 2018
  • การคอมไพล์ภาษาไปเป็น WebAssembly หรือ JavaScript เพียงอย่างเดียวไม่เพียงพอ
  • จำเป็นต้องรองรับระบบนิเวศของแพ็กเกจที่นักพัฒนาคุ้นเคย

วงจรชีวิตของ Python Worker

  • Pyodide ถูกฝังมาใน workerd ทำให้สามารถเขียนโค้ด Python ได้
  • ระบุไฟล์ .py ผ่านไฟล์ Wrangler.toml แล้วรัน npx wrangler@latest dev จากนั้นรันไทม์จะฉีด Pyodide ให้โดยอัตโนมัติ

Python interpreter ที่ฝังอยู่ใน Workers runtime

  • CPython คือ implementation อ้างอิงของ Python และ Pyodide คือการพอร์ต CPython ไปยัง WebAssembly
  • Pyodide มี Python standard library เกือบทั้งหมด พร้อม FFI ที่สามารถเรียกใช้ JavaScript API ได้โดยตรง

เวทมนตร์ของ Pyodide และ Foreign Function Interface (FFI)

  • FFI ของ Pyodide ช่วยให้ Python เข้าถึงความสามารถของ JavaScript ได้
  • ทำให้สามารถใช้แพ็กเกจอย่าง FastAPI และ Langchain ได้ทันที

เหตุใด dynamic linking จึงจำเป็น และ static linking ยังไม่เพียงพอ

  • แพ็กเกจ Python จำนวนมากใช้ C FFI เพื่อนำเข้า native library
  • ด้วย dynamic linking ทำให้ Pyodide รองรับแพ็กเกจ Python จำนวนมากที่มี dependency เป็น native library ได้

การรองรับไลบรารีฝั่งเซิร์ฟเวอร์และไคลเอนต์

  • Python มีไลบรารี HTTP client ยอดนิยมมากมาย เช่น httpx, urllib3 และ requests แต่ใน Pyodide จะไม่ทำงานโดยปริยาย
  • ไลบรารีไคลเอนต์แบบ asynchronous สามารถใช้ Fetch API เพื่อส่งคำขอได้

การนำเข้าแพ็กเกจ Python

  • Python Workers รองรับส่วนย่อยของแพ็กเกจ Python ที่ Pyodide มีให้โดยตรง
  • เพียงเพิ่มแพ็กเกจลงในไฟล์ requirements.txt

ลดเวลา cold start ด้วย memory snapshot

  • ระหว่างกระบวนการฉีด Pyodide เข้าไปใน Worker และอัปโหลดไปยัง Cloudflare จะมีการสร้าง memory snapshot เพื่อลดเวลา cold start

รองรับอนาคตด้วยเวอร์ชันของ Pyodide และ compatibility date

  • ใช้ compatibility date และ compatibility flag เพื่อให้เลือกใช้งานพฤติกรรมใหม่และการเปลี่ยนแปลงที่อาจไม่รองรับย้อนหลังได้อย่างชัดเจน

วิธีที่ binding ทำงานใน Python Workers

  • Pyodide มี FFI สำหรับ JavaScript ทำให้สามารถใช้ object, method และ function ของ JavaScript ได้โดยตรงจาก Python

เริ่มต้นใช้งาน Python Workers

  • การรองรับภาษาโปรแกรมใหม่อย่างแท้จริงต้องอาศัยการลงทุนมากกว่าระดับ "hello world"
  • Python เป็นภาษาโปรแกรมยอดนิยมรองจาก JavaScript และ Cloudflare กำลังเดินหน้าขยายการรองรับแพ็กเกจ Python และปรับปรุงประสิทธิภาพอย่างต่อเนื่อง

ความเห็นของ GN⁺

  • การรองรับ Python Workers ของ Cloudflare เป็นพัฒนาการสำคัญที่ขยายการใช้งาน Python ในสถาปัตยกรรม serverless ซึ่งมอบความยืดหยุ่นและทางเลือกมากขึ้นให้แก่นักพัฒนา Python และเปิดโอกาสในการสร้างแอปพลิเคชันบนคลาวด์ได้โดยไม่ต้องพึ่ง JavaScript
  • การผสานรวม Python เข้ากับ WebAssembly ผ่าน Pyodide เปิดความเป็นไปได้ใหม่ในการรันโค้ด Python ทั้งในเบราว์เซอร์และสภาพแวดล้อมแบบ serverless ซึ่งอาจส่งผลอย่างมากต่อระบบนิเวศของ Python โดยเฉพาะในด้าน data science และ machine learning ที่ JavaScript ไม่ได้ครองความนิยมเหนือกว่า
  • เทคโนโลยี dynamic linking และ memory snapshot ช่วยลดเวลาโหลดเริ่มต้นและเปิดทางให้แชร์ทรัพยากรได้อย่างมีประสิทธิภาพ ซึ่งถือเป็นการปรับปรุงประสิทธิภาพที่สำคัญโดยเฉพาะในระบบกระจายขนาดใหญ่
  • การจัดการเวอร์ชันผ่าน compatibility date และ flag มอบวิธีที่ยืดหยุ่นในการรองรับฟีเจอร์ใหม่และอัปเดตต่าง ๆ พร้อมคงเสถียรภาพของโค้ดเดิมไว้ ซึ่งเป็นองค์ประกอบสำคัญสำหรับองค์กรที่ให้บริการระยะยาว
  • เมื่อ Cloudflare ขยายการรองรับ Python Workers มากขึ้น นักพัฒนา Python ก็จะมีตัวเลือกมากขึ้นในการเชื่อมต่อกับบริการคลาวด์เดิมหรือพัฒนาบริการใหม่ ซึ่งแสดงให้เห็นว่า Python สามารถมีบทบาทสำคัญในโลก serverless computing ได้

1 ความคิดเห็น

 
GN⁺ 2024-04-03
ความคิดเห็นบน Hacker News
  • มีความเห็นเชิงบวกว่าเป็นเรื่องน่ายินดีที่ Cloudflare ให้ความสนใจกับการรัน Python บน Edge ผ่าน WebAssembly มากขึ้น

    • มีการพยายามใช้ Pyodide เพื่อคอมไพล์ Python เป็น WebAssembly แล้วบันเดิลเข้ากับ Workerd เพื่อเร่งเวลาเริ่มต้นด้วย V8 snapshot
    • เวลา cold start ของ Python บน Cloudflare Workers อยู่ที่ประมาณ 1 วินาทีในกรณีที่ดีที่สุด
    • การประกาศครั้งนี้ช่วยให้วัดความสนใจต่อการรัน Python บน Edge ได้ แต่ก็มีข้อเสียบางประการ:
      • จำกัดอยู่เพียง Python/Pyodide เวอร์ชันเดียว
      • การ resolve แพ็กเกจขึ้นอยู่กับ workerd และค่อนข้างยุ่งยาก
      • มีการพึ่งพาโลกของ JS/V8 ในเชิงโครงสร้าง ซึ่งอาจเป็นความท้าทายต่อการลดเวลา cold start
    • แม้จะมีข้อเสียเหล่านี้ ก็ยังยินดีต่อความพยายามลักษณะนี้ และตั้งตารอแอปเจ๋ง ๆ ที่จะถูกสร้างขึ้นจากสิ่งนี้
  • มีความเห็นว่า Cloudflare มีฟีเจอร์ด้านโฮสติงและฐานข้อมูลที่ยอดเยี่ยม แต่ยังไม่ค่อยประสบความสำเร็จมากนักในการทำการตลาดตัวเองในฐานะแพลตฟอร์มสำหรับนักพัฒนา

    • มีคำถามว่า Cloudflare มีบริการโฮสต์คอนเทนเนอร์ที่ไม่ยึดติดกับภาษาแบบเดียวกับ Google Cloud Run หรือไม่
  • มีการประเมินในเชิงบวกว่าเคยลองใช้ JS workers ผ่าน Cloudflare มาแล้ว และพบว่าใช้งานง่ายและเร็วมาก

    • อยากพอร์ตแอป Django ของตนไปใช้ฐานข้อมูล D1 ของ Cloudflare
  • มีความเห็นว่าการเปรียบเทียบประสิทธิภาพกับ JS worker น่าจะเป็นประโยชน์

    • อยากทราบ trade-off คร่าว ๆ พร้อมทั้งมีความกังวลว่าอาจช้าลงเพราะมีหลายชั้นคั่นอยู่
  • มีความเห็นว่าเมื่อ Pyodide ได้รับการสนับสนุนอย่างจริงจัง ก็เริ่มเห็นความหวังว่า Python อาจกลายเป็นทางเลือกแท้จริงของ JavaScript บนฝั่งฟรอนต์เอนด์ได้

  • มีคำถามว่าการเดโมด้วย lzma เป็นความตั้งใจหรือเป็นเพียงความบังเอิญ

    • เรื่องนี้เกี่ยวข้องกับข่าวเทคล่าสุด
  • มีความเห็นว่านี่คือ game changer สำหรับการรันงานด้าน AI บน Cloudflare และรอสิ่งนี้มานานแล้ว

  • มีความเห็นว่าอยากให้ Cloudflare ทำ workers ที่ไม่ได้จำกัดอยู่แค่ JS workers และปฏิบัติต่อ WASM ในฐานะพลเมืองชั้นหนึ่ง

    • ปัจจุบันโค้ด WASM ยังรันอยู่ภายในคอนเท็กซ์ของ JS แต่คาดว่าในอนาคตจะสามารถดีพลอยตรงไปยัง WASM runtime ได้โดยไม่ต้องผ่านคอนเทนเนอร์
  • มีความเห็นว่าได้ผลลัพธ์ที่ดีจากการใช้ CF Pages สร้างเว็บไซต์แบบสแตติก และรู้สึกสนใจข้อเสนอ LLM-as-a-service แบบโอเพนซอร์สของ Cloudflare

    • ระบุว่าการขาดการรองรับ Python เป็นปัญหาหลักที่ทำให้ยังไม่ได้สร้างงานบน Cloudflare มากกว่านี้ และอยากลองอัปเดตครั้งนี้
  • มีความเห็นว่าสงสัยว่าข้อจำกัดที่ใช้ได้เฉพาะแพ็กเกจของ Pyodide จะส่งผลต่อบิลด์ที่ซับซ้อนมากกว่าปกติอย่างไร

    • นึกถึงกรณีที่มีโค้ดที่ไม่ใช่ pure Python จำนวนมากจนต้องรีบิลด์ด้วยตนเอง และหวังว่าการรองรับจาก Cloudflare จะช่วยให้มีการรวมแพ็กเกจเพิ่มขึ้น