ดังที่เราทุกคนรู้ดีว่าเราจำเป็นต้องปกป้อง main()
เมื่อรันโค้ดด้วย multiprocessing
ใน Python โดยใช้ if __name__ == '__main__'
ฉันเข้าใจว่านี่เป็นสิ่งจำเป็นในบางกรณีเพื่อให้สามารถเข้าถึงฟังก์ชันที่กำหนดไว้ใน main แต่ฉันไม่เข้าใจว่าทำไมจึงจำเป็นในกรณีนี้:
file2.py
import numpy as np
from multiprocessing import Pool
class Something(object):
def get_image(self):
return np.random.rand(64,64)
def mp(self):
image = self.get_image()
p = Pool(2)
res1 = p.apply_async(np.sum, (image,))
res2 = p.apply_async(np.mean, (image,))
print(res1.get())
print(res2.get())
p.close()
p.join()
main.py
from file2 import Something
s = Something()
s.mp()
ฟังก์ชันหรือการนำเข้าทั้งหมดที่จำเป็นสำหรับ Something
ในการทำงานเป็นส่วนหนึ่งของ file2.py
เหตุใดกระบวนการย่อยจึงต้องรัน main.py
อีกครั้ง
ฉันคิดว่าโซลูชัน __name__
ไม่ค่อยดีนักเพราะจะทำให้ฉันไม่สามารถแจกจ่ายรหัส file2.py
ได้ เนื่องจากฉันไม่สามารถแน่ใจได้ว่าพวกเขากำลังปกป้องรหัสหลักของพวกเขา ไม่มีวิธีแก้ปัญหาสำหรับ Windows ใช่หรือไม่ แพ็คเกจจะแก้ไขได้อย่างไร (เนื่องจากฉันไม่เคยพบปัญหาใด ๆ ที่ไม่ปกป้องแพ็คเกจหลักของฉันด้วยแพ็คเกจใด ๆ - พวกมันไม่ได้ใช้การประมวลผลหลายตัวหรือเปล่า)
แก้ไข: ฉันรู้ว่านี่เป็นเพราะ fork()
ไม่ได้ใช้งานใน Windows ฉันแค่ถามว่ามีแฮ็กเพื่อให้ล่ามเริ่มต้นที่ file2.py
แทนที่จะเป็น main.py
หรือไม่ เพราะฉันสามารถมั่นใจได้ว่า file2.py
นั้นพึ่งพาตนเองได้
if __name__ == '__main__'
จำเป็นบน Windows เท่านั้น เนื่องจากแพลตฟอร์มนั้นไม่มีfork()
หากคุณเลือกระบบปฏิบัติการ ใดๆ อื่น คุณจะไม่จำเป็นต้องใช้มัน - person Sven Marnach   schedule 14.07.2017file2.py
เป็นไลบรารี และคุณต้องการรองรับโค้ดผู้ใช้ เช่นmain.py
(ซึ่งอาจถูกเขียนโดยบุคคลอื่นในอนาคต) ขออภัย ฉันไม่คิดว่ามีวิธีใดที่จะปกป้องผู้ใช้ของคุณจากข้อกำหนดของmultiprocessing
คุณอาจจำเป็นต้องจัดทำเอกสารว่าโมดูลของคุณต้องการให้ใส่โค้ดสคริปต์ภายในif __name__ == "__main__"
บล็อก เพื่อไม่ให้มีการรันใดๆ หากโมดูลถูกนำเข้า - person Blckknght   schedule 15.07.2017