PyProc เครื่องมือใหม่ที่พัฒนาด้วย Go สำหรับจัดการ Python worker processes ได้เกิดขึ้นในชุมชนนักพัฒนาเป็นทางแก้ไขข้อจำกัดของ Global Interpreter Lock (GIL) ที่มีชื่อเสียงของ Python เครื่องมือนี้สัญญาว่าจะรัน Python processes แบบแยกส่วนด้วยการประมวลผลแบบขนานที่แท้จริง แต่การสนทนาในชุมชนเผยให้เห็นความกังวลเชิงลึกเกี่ยวกับทางเลือกที่มีอยู่และข้อพิจารณาด้านความปลอดภัย
โครงการนี้แก้ไขความท้าทายของการประมวลผลแบบหลายคอร์ของ Python โดยการสร้าง Python interpreter processes แยกต่างหาก โดยแต่ละตัวจะถูกแยกออกจากตัวอื่นๆ อย่างสมบูรณ์ แนวทางนี้หลีกเลี่ยง GIL ทั้งหมด ทำให้สามารถประมวลผลโค้ด Python แบบขนานที่แท้จริงได้ในหลาย CPU cores
คุณสมบัติหลักของ PyProc :
- กระบวนการ Python ที่แยกตัวออกมา 100% โดยไม่มีหน่วยความจำที่ใช้ร่วมกัน
- ความสามารถในการทำงานแบบขนานที่แท้จริงผ่านกระบวนการ Python interpreter หลายตัว
- การติดตั้งใช้งานที่ง่ายดายด้วยการกระจายไฟล์ binary เดียว
- การใช้หน่วยความจำคงที่เพื่อป้องกันข้อผิดพลาด
- สถาปัตยกรรมแบบ message-oriented ที่จัดการการดำเนินงานได้หลายพันล้านครั้ง
มีทางแก้ไขที่มีอยู่แล้ว
สมาชิกชุมชนได้ชี้ไปที่ทางเลือกที่มีอยู่แล้วอย่างรวดเร็ว โดยเฉพาะ go-plugin framework ของ HashiCorp ทางแก้ไขที่มีความเป็นผู้ใหญ่นี้มีฟังก์ชันการทำงานที่คล้ายกันอยู่แล้ว พร้อมรองรับทั้ง net/rpc และ gRPC protocols ทำให้ external processes สามารถเขียนด้วย Python ได้ Framework นี้จัดการการสร้างและจัดการ process โดยอัตโนมัติ และได้พิสูจน์ความน่าเชื่อถือผ่านการใช้งานอย่างกว้างขวางในผลิตภัณฑ์ของ HashiCorp เช่น Nomad และ Packer
การสนทนาทำให้เกิดคำถามว่า PyProc มีข้อได้เปรียบที่สำคัญเหนือทางแก้ไขที่ผ่านการทดสอบมาแล้วเหล่านี้หรือไม่ หรือเป็นการสร้างล้อใหม่ที่มีอยู่แล้ว
ทางเลือกอื่นที่ได้รับการกล่าวถึง:
- HashiCorp go-plugin: เฟรมเวิร์กที่มีความเป็นผู้ใหญ่พร้อมการรองรับ net/rpc และ gRPC ซึ่งถูกใช้ใน Nomad และ Packer
- Starlark: ให้การรับประกันแบบ hermetic ที่แข็งแกร่งกว่าสำหรับการประมวลผลแบบ sandboxed
- Standard microservices: แนวทางแบบดั้งเดิมสำหรับการแยกกระบวนการและความสามารถในการขยายระบบ
ความกังวลด้านความปลอดภัยและ Sandboxing
ส่วนสำคัญของการสนทนาในชุมชนมุ่งเน้นไปที่การขาดความสามารถในการ sandboxing ที่เหมาะสมของ Python นักพัฒนาแสดงความหงุดหงิดเกี่ยวกับการรันสคริปต์ Python ที่ผู้ใช้กำหนดอย่างปลอดภัย โดยเฉพาะการไม่สามารถปิดใช้งาน filesystem และ network system calls สำหรับโค้ดที่ไม่น่าเชื่อถือ
ฉันหวังว่า python จะมีการกำหนดค่า sandbox ที่เหมาะสม นี่จะเยียมสำหรับสคริปต์ที่ผู้ใช้กำหนด แต่เฉพาะในกรณีที่ฉันสามารถปิดใช้งาน filesystem และ network syscalls สำหรับโค้ดที่ผู้ใช้กำหนดได้
ในขณะที่บางคนแนะนำให้ใช้ Unix Domain Sockets สำหรับการแยกการสื่อสารและข้อจำกัดแบบ container คนอื่นๆ แนะนำ Starlark เป็นทางเลือกที่มีการรับประกันแบบ hermetic ที่แข็งแกร่งกว่า วิธีการแยกแบบดั้งเดิมเช่น chroot ถูกปฏิเสธว่าไม่เพียงพอสำหรับวัตถุประสงค์ด้านความปลอดภัย
คำถามเกี่ยวกับสถาปัตยกรรม Microservices
สถาปัตยกรรมพื้นฐานของ PyProc ยังได้รับการตรวจสอบจากนักพัฒนาที่ตั้งคำถามเกี่ยวกับความแตกต่างจาก microservices มาตรฐาน นักวิจารณ์สงสัยว่าการรัน pool ของ Python worker processes แตกต่างอย่างมีความหมายจากการ deploy microservices ที่ใช้ Python อย่างไร ซึ่งมีการแยก process และความสามารถในการขยายตัวอยู่แล้ว
การตั้งคำถามนี้เน้นการถกเถียงที่กว้างขึ้นเกี่ยวกับว่าความซับซ้อนของการจัดการ process pool นั้นสมเหตุสมผลกับประโยชน์เหนือรูปแบบสถาปัตยกรรมที่ง่ายกว่าที่นักพัฒนาเข้าใจและเชื่อถืออยู่แล้วหรือไม่
การประยุกต์ใช้จริงและศักยภาพในอนาคต
แม้จะมีการวิจารณ์ นักพัฒนาบางคนเห็นการประยุกต์ใช้ที่มีศักยภาพสำหรับ PyProc โดยเฉพาะในการแทนที่ระบบจัดการ workflow ที่ซับซ้อน แนวทางของเครื่องมือในการจัดการ CPU-bound Python workloads อาจพิสูจน์ให้เห็นคุณค่าสำหรับแอปพลิเคชัน data science และงาน machine learning inference ที่ GIL กลายเป็นคอขวดที่สำคัญ
การสนทนาในชุมชนสะท้อนถึงความท้าทายที่ต่อเนื่องในการสร้างสมดุลระหว่างความง่ายในการใช้งานของ Python กับความต้องการด้านประสิทธิภาพในสภาพแวดล้อมการผลิต ในขณะที่ PyProc เสนอแนวทางหนึ่งต่อปัญหานี้ การถกเถียงแสดงให้เห็นว่านักพัฒนากำลังชั่งน้ำหนักอย่างรอบคอบเทียบกับทางแก้ไขที่มีอยู่และได้รับการพิสูจน์แล้ว
อ้างอิง: pyproc