تقنية

select في بايثون: هل فحص الجاهزية يقرأ البيانات؟

فحصا الجاهزية True قبل قراءة بايتنا المحلي R
لم نستدعِ recv بعد. [1] [2]

فحص الجاهزية مختلف عن سحب البيانات. [1] [2]

الخلاصة السريعة

يبقى بايتنا للقراءة بعد فحصين. [1] [2]

  • ننشئ زوج مقابس متصلة ونرسل R. [1] [2]
  • يعطي فحصا الجاهزية True. [1] [2]
  • تعيد recv(1) البايت نفسه. [1] [2]
  • بعد قراءته يصبح الفحص False هنا. [1] [2]
  • اختبرنا 3.12.14؛ الطرفان مفتوحان أثناء الفحص. [1] [2]

المثال

import socket as s, select as q
a,b=s.socketpair()
try:
 a.sendall(b'R')
 print(bool(q.select([b],[],[],1)[0]))
 print(bool(q.select([b],[],[],0)[0]))
 print(b.recv(1))
 print(bool(q.select([b],[],[],0)[0]))
finally: a.close();b.close()

[1] [2]

المخرجات True، True، b'R'، False. [1] [2]

قائمة جاهزية أم بيانات؟

تعيد select قوائم بالكائنات الجاهزة؛ القائمة الأولى للقراءة. المهلة 0 فحص دون انتظار. [1] [2]

بعد القراءة نستنفد بايت المثال؛ الفحص السابق لم يسحبه. [1] [2]

تعيد recv البايت R ويصبح فحص الجاهزية False والطرف الآخر مفتوح
بعد قراءة بايتنا. [1] [2]

حد التجربة

تجربة محلية ببايت واحد؛ لا نعمم النتيجة على اتصال مغلق أو وصول رسالة كاملة. ويندوز يقبل المقابس، لا الملفات العادية. [1] [2]

المراجع

  1. Python: select
  2. Python: socket
  3. موضوع تك: لغة بايثون — مفردات
  4. موضوع تك: تطبيقات بايثون — مفردات

أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.