2025, Oct 01 19:32

Windows में Python multiprocessing पर access violation: कारण और समाधान

Windows पर Python multiprocessing में pytest पर 'access violation' दिखे तो घबराएँ नहीं: यह SentinelOne जैसे एंटीवायरस से ट्रिगर हो सकता है. कारण व समाधान और जांच के तरीके

Windows पर कोई साधारण multiprocessing स्क्रिप्ट "Windows fatal exception: access violation" छापना शुरू कर दे, लेकिन चलती रहे — यह स्वाभाविक रूप से тревожит. यह संदेश तभी दिखता है जब faulthandler सक्षम हो; इसी वजह से pytest इसे दिखा देता है, जबकि सीधे Python चलाने पर सब कुछ साफ-सुथरा लग सकता है। नीचे Windows 10 और Windows 11 पर Python 3.10 और 3.12 में इस व्यवहार को दोहराने वाला एक न्यूनतम उदाहरण दिया गया है।

दोहराने योग्य उदाहरण

import multiprocessing as mp
import faulthandler
faulthandler.enable()
def worker_task():
    import os
    print(f"Worker PID: {os.getpid()}")
    print("Worker process completed")
def run_case():
    proc = mp.Process(target=worker_task)
    proc.start()
    proc.join()
    print(f"Process exit code: {proc.exitcode}")
if __name__ == "__main__":
    print("Direct run:")
    run_case()
    print("Success")

faulthandler सक्षम होने पर कंसोल पर access violation छपता है, जबकि प्रक्रिया पूरी हो जाती है और Python कोड चलता रहता है।

ट्रेसबैक क्या दिखाता है

Windows fatal exception: access violation
Current thread 0x00000f48 (most recent call first):
  File "C:\Python\cpython-3.10.16-windows-x86_64-none\lib\multiprocessing\popen_spawn_win32.py", line 73 in __init__
  File "C:\Python\cpython-3.10.16-windows-x86_64-none\lib\multiprocessing\context.py", line 336 in _Popen
  File "C:\Python\cpython-3.10.16-windows-x86_64-none\lib\multiprocessing\context.py", line 224 in _Popen
  File "C:\Python\cpython-3.10.16-windows-x86_64-none\lib\multiprocessing\process.py", line 121 in start
  File "C:\src\sandbox\minimal.py", line 5 in test_reproduce

यह चाइल्ड प्रक्रिया के निर्माण, विशेष रूप से _winapi.CreateProcess() की ओर संकेत करता है। यानी संदेश प्रक्रिया स्टार्टअप के आसपास उठता है, न कि आपके worker कोड के अंदर। अगर faulthandler सक्षम नहीं है, तो सामान्य Python रन के दौरान यह आउटपुट नहीं दिखेगा; pytest इसे सक्षम करता है, इसलिए प्रिंटआउट दिखाई देता है।

इस मामले में मूल कारण

यह व्यवहार एक एंटीवायरस प्रोडक्ट, SentinelOne एजेंट, की वजह से था। एजेंट को निष्क्रिय करने पर access violation का प्रिंटआउट गायब हो गया; दोबारा सक्षम करने पर यह फिर दिखा। Windows 11 Pro की दूसरी मशीन पर, Python 3.12.10 और बिना किसी एंटीवायरस के, यही कोड बिना इस संदेश के चलता है। अतिरिक्त जाँच के लिए, एक तुच्छ subprocess चलाना और साफ-सुथरी Python स्थापना आज़माना सुझाया गया ताकि पता चले कि समस्या multiprocessing से जुड़ी है या परिवेश से। ऊपर दिया गया न्यूनतम उदाहरण दिखाता है कि यह मुद्दा चाइल्ड प्रक्रिया क्या चलाती है, उस पर निर्भर नहीं है।

faulthandler इसे क्यों उजागर करता है

faulthandler का उद्देश्य लो-लेवल त्रुटियों को stderr पर डायग्नोस्टिक्स छापकर सामने लाना है। इसलिए pytest उपयोगकर्ताओं को यह संदेश अधिक दिखता है: pytest faulthandler चालू कर देता है। स्क्रिप्ट आगे चलती रहती है और Python-स्तर की कोई अपवाद नहीं उठती, फिर भी access violation का प्रिंटआउट आता है।

समाधान

यहाँ समाधान कोड-स्तर का नहीं, बल्कि परिवेश-सम्बंधी है। SentinelOne एजेंट को निष्क्रिय करने से प्रक्रिया निर्माण के दौरान आने वाला access violation प्रिंटआउट समाप्त हो गया, और पुनः सक्षम करने पर संदेश फिर दिखा। Python कोड में किसी बदलाव की आवश्यकता नहीं पड़ी।

Windows, multiprocessing और pytest उपयोगकर्ताओं के लिए यह क्यों मायने रखता है

Windows पर multiprocessing के साथ काम करते समय, प्रक्रिया स्टार्टअप से निकले संदेशों को आसानी से एप्लिकेशन विफलता समझ लिया जाता है। अगर आप pytest के तहत परीक्षण चलाते हैं, तो faulthandler ऐसे लो-लेवल संकेतों को भी दिखा देता है, भले ही आपका कोड सामान्य रूप से काम कर रहा हो। यह जानना कि कोई एंटीवायरस एजेंट ऐसा प्रिंटआउट करा सकता है, आपके worker लॉजिक की वास्तविक खामियों और झूठे अलार्म में फर्क करने में मदद करता है।

मुख्य बातें

अगर mp.Process स्टार्टअप के दौरान "Windows fatal exception: access violation" दिखे और आपकी स्क्रिप्ट फिर भी पूरी हो जाए, तो परिवेशीय कारणों पर विचार करें। ऊपर वर्णित मामले में ट्रिगर SentinelOne एजेंट था। faulthandler बंद होने पर आप शायद संदेश देख ही न पाएं, जबकि pytest इसे डिफ़ॉल्ट रूप से दिखाता है। बिना एंटीवायरस वाली मशीन पर जाँचना, साफ Python इंस्टॉलेशन आज़माना, या एक साधारण subprocess चलाना — ये व्यावहारिक तरीके हैं यह परखने के कि समस्या आपके कोड में नहीं है।