பைத்தான் அசிங்கியோ கோரூட்டீன்களை உள்ளமைக்கப்பட்ட பிழைத்திருத்த பயன்முறையைப் பயன்படுத்தி பிழைத்திருத்தம் செய்வதற்கான விரிவான வழிகாட்டி. பொதுவான ஒத்திசைவற்ற நிரலாக்க சிக்கல்களைக் கண்டறிந்து தீர்க்க கற்றுக்கொள்ளுங்கள்.
பைத்தான் கோரூட்டீன் பிழைத்திருத்தம்: அசிங்கியோ பிழைத்திருத்த பயன்முறையில் தேர்ச்சி பெறுதல்
பைத்தானில் asyncio
உடன் ஒத்திசைவற்ற நிரலாக்கம், குறிப்பாக I/O-சார்ந்த செயல்பாடுகளுக்கு குறிப்பிடத்தக்க செயல்திறன் நன்மைகளை வழங்குகிறது. இருப்பினும், அதன் நேரியல் அல்லாத செயலாக்க ஓட்டம் காரணமாக ஒத்திசைவற்ற குறியீட்டை பிழைத்திருத்தம் செய்வது சவாலானது. பைத்தான் asyncio
-க்கு ஒரு உள்ளமைக்கப்பட்ட பிழைத்திருத்த பயன்முறையை வழங்குகிறது, இது பிழைத்திருத்த செயல்முறையை பெரிதும் எளிதாக்கும். இந்த வழிகாட்டி உங்கள் ஒத்திசைவற்ற பயன்பாடுகளில் பொதுவான சிக்கல்களைக் கண்டறிந்து தீர்க்க asyncio
பிழைத்திருத்த பயன்முறையை எவ்வாறு திறம்படப் பயன்படுத்துவது என்பதை ஆராயும்.
ஒத்திசைவற்ற நிரலாக்க சவால்களைப் புரிந்துகொள்ளுதல்
பிழைத்திருத்த பயன்முறையில் நுழைவதற்கு முன், ஒத்திசைவற்ற குறியீட்டை பிழைதிருத்தம் செய்வதில் உள்ள பொதுவான சவால்களைப் புரிந்துகொள்வது அவசியம்:
- நேரியல் அல்லாத செயலாக்கம்: ஒத்திசைவற்ற குறியீடு வரிசையாகச் செயல்படுத்தப்படுவதில்லை. கோரூட்டீன்கள் கட்டுப்பாட்டை நிகழ்வு வளையத்திற்குத் திரும்பக் கொடுக்கின்றன, இது செயலாக்கப் பாதையைக் கண்டறிவதை கடினமாக்குகிறது.
- சூழல் மாறுதல்: டாஸ்க்குகளுக்கு இடையில் அடிக்கடி சூழல் மாறுவது பிழைகளின் மூலத்தை மறைக்கக்கூடும்.
- பிழை பரவல்: ஒரு கோரூட்டீனில் ஏற்படும் பிழைகள் அதை அழைக்கும் கோரூட்டீனில் உடனடியாகத் தெரியாமல் இருக்கலாம், இது மூல காரணத்தைக் கண்டறிவதை கடினமாக்குகிறது.
- ரேஸ் கண்டிஷன்கள்: பல கோரூட்டீன்களால் ஒரே நேரத்தில் அணுகப்படும் பகிரப்பட்ட வளங்கள் ரேஸ் கண்டிஷன்களுக்கு வழிவகுக்கும், இதன் விளைவாக கணிக்க முடியாத நடத்தை ஏற்படும்.
- முட்டுக்கட்டைகள் (Deadlocks): கோரூட்டீன்கள் ஒன்றுக்கொன்று காலவரையின்றி காத்திருப்பது முட்டுக்கட்டைகளை ஏற்படுத்தி, பயன்பாட்டை நிறுத்திவிடும்.
அசிங்கியோ பிழைத்திருத்த பயன்முறையின் அறிமுகம்
asyncio
பிழைத்திருத்த பயன்முறை உங்கள் ஒத்திசைவற்ற குறியீட்டின் செயலாக்கம் பற்றிய மதிப்புமிக்க நுண்ணறிவுகளை வழங்குகிறது. இது பின்வரும் அம்சங்களை வழங்குகிறது:
- விரிவான பதிவிடுதல்: கோரூட்டீன் உருவாக்கம், செயலாக்கம், ரத்துசெய்தல் மற்றும் விதிவிலக்கு கையாளுதல் தொடர்பான பல்வேறு நிகழ்வுகளைப் பதிவு செய்கிறது.
- வள எச்சரிக்கைகள்: மூடப்படாத சாக்கெட்டுகள், மூடப்படாத கோப்புகள் மற்றும் பிற வளக் கசிவுகளைக் கண்டறிகிறது.
- மெதுவான கால்பேக் கண்டறிதல்: ஒரு குறிப்பிட்ட வரம்பை விட அதிக நேரம் எடுக்கும் கால்பேக்குகளைக் கண்டறிந்து, செயல்திறன் தடங்கல்களுக்கான சாத்தியக்கூறுகளைக் குறிக்கிறது.
- டாஸ்க் ரத்துசெய்தல் கண்காணிப்பு: டாஸ்க் ரத்துசெய்யப்படுவது பற்றிய தகவல்களை வழங்குகிறது, டாஸ்க்குகள் ஏன் ரத்து செய்யப்படுகின்றன மற்றும் அவை சரியாகக் கையாளப்படுகின்றனவா என்பதைப் புரிந்துகொள்ள உதவுகிறது.
- விதிவிலக்கு சூழல்: கோரூட்டீன்களுக்குள் எழுப்பப்படும் விதிவிலக்குகளுக்கு கூடுதல் சூழலை வழங்குகிறது, இது பிழையை அதன் மூலத்திற்குத் திரும்பக் கண்டறிவதை எளிதாக்குகிறது.
அசிங்கியோ பிழைத்திருத்த பயன்முறையை இயக்குதல்
நீங்கள் பல வழிகளில் asyncio
பிழைத்திருத்த பயன்முறையை இயக்கலாம்:
1. PYTHONASYNCIODEBUG
சூழல் மாறியைப் பயன்படுத்துதல்
உங்கள் பைத்தான் ஸ்கிரிப்டை இயக்கும் முன் PYTHONASYNCIODEBUG
சூழல் மாறியை 1
என அமைப்பதே பிழைத்திருத்த பயன்முறையை இயக்குவதற்கான எளிய வழி:
export PYTHONASYNCIODEBUG=1
python your_script.py
இது முழு ஸ்கிரிப்ட்டிற்கும் பிழைத்திருத்த பயன்முறையை இயக்கும்.
2. asyncio.run()
இல் பிழைத்திருத்தக் கொடியை அமைத்தல்
உங்கள் நிகழ்வு வளையத்தைத் தொடங்க நீங்கள் asyncio.run()
ஐப் பயன்படுத்தினால், நீங்கள் debug=True
என்ற தருமதிப்பை அனுப்பலாம்:
import asyncio
async def main():
print("Hello, asyncio!")
if __name__ == "__main__":
asyncio.run(main(), debug=True)
3. loop.set_debug()
ஐப் பயன்படுத்துதல்
நிகழ்வு வளைய நிகழ்வைப் பெற்று set_debug(True)
ஐ அழைப்பதன் மூலமும் நீங்கள் பிழைத்திருத்த பயன்முறையை இயக்கலாம்:
import asyncio
async def main():
print("Hello, asyncio!")
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.set_debug(True)
loop.run_until_complete(main())
பிழைத்திருத்த வெளியீட்டை விளக்குதல்
பிழைத்திருத்த பயன்முறை இயக்கப்பட்டவுடன், asyncio
விரிவான பதிவுச் செய்திகளை உருவாக்கும். இந்தச் செய்திகள் உங்கள் கோரூட்டீன்களின் செயலாக்கம் பற்றிய மதிப்புமிக்க தகவல்களை வழங்குகின்றன. இங்கே சில பொதுவான பிழைத்திருத்த வெளியீட்டு வகைகள் மற்றும் அவற்றை எவ்வாறு விளக்குவது என்பது கொடுக்கப்பட்டுள்ளது:
1. கோரூட்டீன் உருவாக்கம் மற்றும் செயலாக்கம்
கோரூட்டீன்கள் உருவாக்கப்பட்டு தொடங்கப்படும்போது பிழைத்திருத்த பயன்முறை பதிவு செய்கிறது. இது உங்கள் கோரூட்டீன்களின் வாழ்க்கைச் சுழற்சியைக் கண்காணிக்க உதவுகிறது:
asyncio | execute () running at example.py:3>
asyncio | Task-1: created at example.py:7
இந்த வெளியீடு example.py
இன் 7வது வரியில் Task-1
என்ற பெயரில் ஒரு டாஸ்க் உருவாக்கப்பட்டது மற்றும் தற்போது 3வது வரியில் வரையறுக்கப்பட்ட a()
கோரூட்டீனை இயக்குகிறது என்பதைக் காட்டுகிறது.
2. டாஸ்க் ரத்துசெய்தல்
ஒரு டாஸ்க் ரத்து செய்யப்படும்போது, பிழைத்திருத்த பயன்முறை ரத்துசெய்யும் நிகழ்வையும் அதற்கான காரணத்தையும் பதிவு செய்கிறது:
asyncio | Task-1: cancelling
asyncio | Task-1: cancelled by () running at example.py:10>
இது Task-1
ஆனது Task-2
ஆல் ரத்து செய்யப்பட்டது என்பதைக் குறிக்கிறது. எதிர்பாராத நடத்தையைத் தடுக்க டாஸ்க் ரத்துசெய்தலைப் புரிந்துகொள்வது முக்கியம்.
3. வள எச்சரிக்கைகள்
சாக்கெட்டுகள் மற்றும் கோப்புகள் போன்ற மூடப்படாத வளங்களைப் பற்றி பிழைத்திருத்த பயன்முறை எச்சரிக்கிறது:
ResourceWarning: unclosed
இந்த எச்சரிக்கைகள் வளக் கசிவுகளைக் கண்டறிந்து சரிசெய்ய உதவுகின்றன, இது செயல்திறன் குறைவதற்கும் கணினி ஸ்திரத்தன்மைக்கும் வழிவகுக்கும்.
4. மெதுவான கால்பேக் கண்டறிதல்
பிழைத்திருத்த பயன்முறை ஒரு குறிப்பிட்ட வரம்பை விட அதிக நேரம் எடுக்கும் கால்பேக்குகளைக் கண்டறிய முடியும். இது செயல்திறன் தடங்கல்களைக் கண்டறிய உதவுகிறது:
asyncio | Task was destroyed but it is pending!
pending time: 12345.678 ms
5. விதிவிலக்கு கையாளுதல்
பிழைத்திருத்த பயன்முறை கோரூட்டீன்களுக்குள் எழுப்பப்படும் விதிவிலக்குகளுக்கு, விதிவிலக்கு ஏற்பட்ட டாஸ்க் மற்றும் கோரூட்டீன் உட்பட கூடுதல் சூழலை வழங்குகிறது:
asyncio | Task exception was never retrieved
future: () done, raised ValueError('Invalid value')>
இந்த வெளியீடு Task-1
இல் ஒரு ValueError
எழுப்பப்பட்டது மற்றும் அது சரியாகக் கையாளப்படவில்லை என்பதைக் குறிக்கிறது.
அசிங்கியோ பிழைத்திருத்த பயன்முறையுடன் பிழைத்திருத்தம் செய்வதற்கான நடைமுறை எடுத்துக்காட்டுகள்
பொதுவான சிக்கல்களைக் கண்டறிய asyncio
பிழைத்திருத்த பயன்முறையை எவ்வாறு பயன்படுத்துவது என்பதற்கான சில நடைமுறை எடுத்துக்காட்டுகளைப் பார்ப்போம்:
1. மூடப்படாத சாக்கெட்டுகளைக் கண்டறிதல்
ஒரு சாக்கெட்டை உருவாக்கி ஆனால் அதைச் சரியாக மூடாத பின்வரும் குறியீட்டைக் கவனியுங்கள்:
import asyncio
import socket
async def handle_client(reader, writer):
data = await reader.read(100)
message = data.decode()
addr = writer.get_extra_info('peername')
print(f"Received {message!r} from {addr!r}")
print(f"Send: {message!r}")
writer.write(data)
await writer.drain()
# Missing: writer.close()
async def main():
server = await asyncio.start_server(
handle_client,
'127.0.0.1',
8888
)
addr = server.sockets[0].getsockname()
print(f'Serving on {addr}')
async with server:
await server.serve_forever()
if __name__ == "__main__":
asyncio.run(main(), debug=True)
இந்தக் குறியீட்டை பிழைத்திருத்த பயன்முறையில் இயக்கும்போது, மூடப்படாத சாக்கெட்டைக் குறிக்கும் ResourceWarning
ஐப் பார்ப்பீர்கள்:
ResourceWarning: unclosed
இதைச் சரிசெய்ய, சாக்கெட் சரியாக மூடப்பட்டிருப்பதை உறுதி செய்ய வேண்டும், எடுத்துக்காட்டாக, handle_client
கோரூட்டீனில் writer.close()
ஐச் சேர்த்து, அதற்காகக் காத்திருக்க வேண்டும்:
writer.close()
await writer.wait_closed()
2. மெதுவான கால்பேக்குகளைக் கண்டறிதல்
ஒரு மெதுவான செயல்பாட்டைச் செய்யும் ஒரு கோரூட்டீன் உங்களிடம் இருப்பதாக வைத்துக்கொள்வோம்:
import asyncio
import time
async def slow_function():
print("Starting slow function")
time.sleep(2)
print("Slow function finished")
return "Result"
async def main():
task = asyncio.create_task(slow_function())
result = await task
print(f"Result: {result}")
if __name__ == "__main__":
asyncio.run(main(), debug=True)
இயல்பான பிழைத்திருத்த வெளியீடு மெதுவான கால்பேக்குகளை நேரடியாகக் குறிப்பிடவில்லை என்றாலும், கவனமாகப் பதிவிடுதல் மற்றும் cProfile அல்லது py-spy போன்ற சுயவிவரக் கருவிகளுடன் அதை இணைப்பது உங்கள் குறியீட்டின் மெதுவான பகுதிகளைக் குறைக்க உங்களை அனுமதிக்கிறது. மெதுவான செயல்பாடுகளுக்கு முன்னும் பின்னும் நேரமுத்திரைகளைப் பதிவு செய்வதைக் கவனியுங்கள். பின்னர் cProfile போன்ற கருவிகளை பதிவுசெய்யப்பட்ட செயல்பாட்டு அழைப்புகளில் பயன்படுத்தி தடங்கல்களைத் தனிமைப்படுத்தலாம்.
3. டாஸ்க் ரத்துசெய்தலை பிழைத்திருத்தம் செய்தல்
ஒரு டாஸ்க் எதிர்பாராதவிதமாக ரத்து செய்யப்படும் சூழ்நிலையைக் கவனியுங்கள்:
import asyncio
async def worker():
try:
while True:
print("Working...")
await asyncio.sleep(0.5)
except asyncio.CancelledError:
print("Worker cancelled")
async def main():
task = asyncio.create_task(worker())
await asyncio.sleep(2)
task.cancel()
try:
await task
except asyncio.CancelledError:
print("Task cancelled in main")
if __name__ == "__main__":
asyncio.run(main(), debug=True)
பிழைத்திருத்த வெளியீடு டாஸ்க் ரத்து செய்யப்படுவதைக் காண்பிக்கும்:
asyncio | execute started at example.py:16>
Working...
Working...
Working...
Working...
asyncio | Task-1: cancelling
Worker cancelled
asyncio | Task-1: cancelled by result=None>
Task cancelled in main
இது டாஸ்க் main()
கோரூட்டீனால் ரத்து செய்யப்பட்டது என்பதை உறுதிப்படுத்துகிறது. except asyncio.CancelledError
தொகுதி, டாஸ்க் முழுமையாக நிறுத்தப்படுவதற்கு முன்பு சுத்தம் செய்ய அனுமதிக்கிறது, வளக் கசிவுகள் அல்லது சீரற்ற நிலையைத் தடுக்கிறது.
4. கோரூட்டீன்களில் விதிவிலக்குகளைக் கையாளுதல்
ஒத்திசைவற்ற குறியீட்டில் சரியான விதிவிலக்கு கையாளுதல் மிகவும் முக்கியமானது. கையாளப்படாத விதிவிலக்குடன் பின்வரும் எடுத்துக்காட்டைக் கவனியுங்கள்:
import asyncio
async def divide(x, y):
return x / y
async def main():
result = await divide(10, 0)
print(f"Result: {result}")
if __name__ == "__main__":
asyncio.run(main(), debug=True)
பிழைத்திருத்த பயன்முறை கையாளப்படாத விதிவிலக்கைப் புகாரளிக்கும்:
asyncio | Task exception was never retrieved
future: result=None, exception=ZeroDivisionError('division by zero')>
இந்த விதிவிலக்கைக் கையாள, நீங்கள் try...except
தொகுதியைப் பயன்படுத்தலாம்:
import asyncio
async def divide(x, y):
return x / y
async def main():
try:
result = await divide(10, 0)
print(f"Result: {result}")
except ZeroDivisionError as e:
print(f"Error: {e}")
if __name__ == "__main__":
asyncio.run(main(), debug=True)
இப்போது, விதிவிலக்கு பிடிக்கப்பட்டு நேர்த்தியாகக் கையாளப்படும்.
அசிங்கியோ பிழைத்திருத்தத்திற்கான சிறந்த நடைமுறைகள்
asyncio
குறியீட்டை பிழைத்திருத்தம் செய்வதற்கான சில சிறந்த நடைமுறைகள் இங்கே:
- பிழைத்திருத்த பயன்முறையை இயக்கவும்: மேம்பாடு மற்றும் சோதனையின் போது எப்போதும் பிழைத்திருத்த பயன்முறையை இயக்கவும்.
- பதிவிடுதலைப் பயன்படுத்தவும்: உங்கள் கோரூட்டீன்களின் செயலாக்க ஓட்டத்தைக் கண்காணிக்க விரிவான பதிவிடுதலைச் சேர்க்கவும். அசிங்கியோ குறிப்பிட்ட நிகழ்வுகளுக்கு
logging.getLogger('asyncio')
ஐப் பயன்படுத்தவும், மற்றும் பயன்பாடு சார்ந்த தரவுகளுக்கு உங்கள் சொந்த பதிப்பான்களைப் பயன்படுத்தவும். - விதிவிலக்குகளைக் கையாளவும்: கையாளப்படாத விதிவிலக்குகள் உங்கள் பயன்பாட்டை செயலிழக்கச் செய்வதைத் தடுக்க வலுவான விதிவிலக்கு கையாளுதலைச் செயல்படுத்தவும்.
- டாஸ்க் குழுக்களைப் பயன்படுத்தவும் (Python 3.11+): டாஸ்க் குழுக்கள் தொடர்புடைய டாஸ்க்குகளின் குழுக்களுக்குள் விதிவிலக்கு கையாளுதல் மற்றும் ரத்துசெய்வதை எளிதாக்குகின்றன.
- உங்கள் குறியீட்டை சுயவிவரப்படுத்தவும்: செயல்திறன் தடங்கல்களைக் கண்டறிய சுயவிவரக் கருவிகளைப் பயன்படுத்தவும்.
- யூனிட் சோதனைகளை எழுதவும்: உங்கள் கோரூட்டீன்களின் நடத்தையைச் சரிபார்க்க முழுமையான யூனிட் சோதனைகளை எழுதவும்.
- வகை குறிப்புகளைப் பயன்படுத்தவும்: வகை தொடர்பான பிழைகளை முன்கூட்டியே பிடிக்க வகை குறிப்புகளைப் பயன்படுத்தவும்.
- ஒரு பிழைத்திருத்தியைப் பயன்படுத்துவதைக் கருத்தில் கொள்ளுங்கள்: `pdb` அல்லது IDE பிழைத்திருத்திகள் போன்ற கருவிகளை அசிங்கியோ குறியீட்டின் வழியாகச் செல்லப் பயன்படுத்தலாம். இருப்பினும், ஒத்திசைவற்ற செயலாக்கத்தின் தன்மை காரணமாக கவனமாகப் பதிவிடுதலுடன் கூடிய பிழைத்திருத்த பயன்முறையை விட அவை பெரும்பாலும் குறைவான செயல்திறன் கொண்டவை.
மேம்பட்ட பிழைத்திருத்த நுட்பங்கள்
அடிப்படை பிழைத்திருத்த பயன்முறைக்கு அப்பால், இந்த மேம்பட்ட நுட்பங்களைக் கருத்தில் கொள்ளுங்கள்:
1. தனிப்பயன் நிகழ்வு வளையக் கொள்கைகள்
நிகழ்வுகளை இடைமறித்து பதிவு செய்ய நீங்கள் தனிப்பயன் நிகழ்வு வளையக் கொள்கைகளை உருவாக்கலாம். இது பிழைத்திருத்த செயல்முறையின் மீது இன்னும் நுணுக்கமான கட்டுப்பாட்டைப் பெற உங்களை அனுமதிக்கிறது.
2. மூன்றாம் தரப்பு பிழைத்திருத்த கருவிகளைப் பயன்படுத்துதல்
பல மூன்றாம் தரப்பு பிழைத்திருத்த கருவிகள் asyncio
குறியீட்டை பிழைத்திருத்தம் செய்ய உங்களுக்கு உதவக்கூடும், அவை:
- PySnooper: உங்கள் குறியீட்டின் செயலாக்கத்தை தானாகவே பதிவு செய்யும் ஒரு சக்திவாய்ந்த பிழைத்திருத்த கருவி.
- pdb++: மேம்பட்ட அம்சங்களுடன் கூடிய நிலையான
pdb
பிழைத்திருத்தியின் மேம்படுத்தப்பட்ட பதிப்பு. - asyncio_inspector: அசிங்கியோ நிகழ்வு வளையங்களை ஆய்வு செய்வதற்காக பிரத்யேகமாக வடிவமைக்கப்பட்ட ஒரு நூலகம்.
3. மங்கி பேட்சிங் (கவனத்துடன் பயன்படுத்தவும்)
தீவிரமான சந்தர்ப்பங்களில், பிழைத்திருத்த நோக்கங்களுக்காக asyncio
செயல்பாடுகளின் நடத்தையை மாற்ற நீங்கள் மங்கி பேட்சிங்கைப் பயன்படுத்தலாம். இருப்பினும், இது கவனமாக செய்யப்பட வேண்டும், ஏனெனில் இது நுட்பமான பிழைகளை அறிமுகப்படுத்தலாம் மற்றும் உங்கள் குறியீட்டைப் பராமரிப்பதை கடினமாக்கலாம். இது முற்றிலும் அவசியமானாலன்றி பொதுவாக ஊக்கப்படுத்தப்படுவதில்லை.
முடிவுரை
ஒத்திசைவற்ற குறியீட்டை பிழைத்திருத்தம் செய்வது சவாலானதாக இருக்கலாம், ஆனால் asyncio
பிழைத்திருத்த பயன்முறை செயல்முறையை எளிதாக்க மதிப்புமிக்க கருவிகள் மற்றும் நுண்ணறிவுகளை வழங்குகிறது. பிழைத்திருத்த பயன்முறையை இயக்குவதன் மூலமும், வெளியீட்டை விளக்குவதன் மூலமும், சிறந்த நடைமுறைகளைப் பின்பற்றுவதன் மூலமும், உங்கள் ஒத்திசைவற்ற பயன்பாடுகளில் பொதுவான சிக்கல்களைத் திறம்படக் கண்டறிந்து தீர்க்க முடியும், இது மிகவும் வலுவான மற்றும் செயல்திறன் மிக்க குறியீட்டிற்கு வழிவகுக்கும். சிறந்த முடிவுகளுக்கு பிழைத்திருத்த பயன்முறையை பதிவிடுதல், சுயவிவரப்படுத்துதல் மற்றும் முழுமையான சோதனை ஆகியவற்றுடன் இணைக்க நினைவில் கொள்ளுங்கள். பயிற்சி மற்றும் சரியான கருவிகளுடன், நீங்கள் asyncio
கோரூட்டீன்களை பிழைத்திருத்தம் செய்யும் கலையில் தேர்ச்சி பெறலாம் மற்றும் அளவிடக்கூடிய, திறமையான மற்றும் நம்பகமான ஒத்திசைவற்ற பயன்பாடுகளை உருவாக்கலாம்.