time.sleep — هل ينام الخيط أم العملية؟
-
01-07-2019 - |
سؤال
في بايثون لـ *nix، يفعل time.sleep()
منع الموضوع أو العملية؟
المحلول
إنه يمنع الخيط.إذا نظرت إلى Modules/timemodule.c في مصدر Python، فسترى ذلك في الاستدعاء floatsleep()
, ، يتم تغليف الجزء الأساسي من عملية السكون في كتلة Py_BEGIN_ALLOW_THREADS وPy_END_ALLOW_THREADS، مما يسمح للخيوط الأخرى بمواصلة التنفيذ أثناء سكون الخيوط الحالية.يمكنك أيضًا اختبار ذلك باستخدام برنامج بايثون بسيط:
import time
from threading import Thread
class worker(Thread):
def run(self):
for x in xrange(0,11):
print x
time.sleep(1)
class waiter(Thread):
def run(self):
for x in xrange(100,103):
print x
time.sleep(5)
def run():
worker().start()
waiter().start()
والتي سوف تطبع:
>>> thread_test.run()
0
100
>>> 1
2
3
4
5
101
6
7
8
9
10
102
نصائح أخرى
سوف ينام الخيط فقط إلا في حالة أن التطبيق الخاص بك يحتوي على خيط واحد فقط، وفي هذه الحالة سوف ينام الخيط وبفعالية العملية أيضًا.
ومع ذلك، لا تحدد وثائق بايثون الخاصة بالنوم هذا الأمر، لذلك يمكنني بالتأكيد فهم الارتباك!
فقط الخيط.
سيتم حظر الخيط، ولكن العملية لا تزال على قيد الحياة.
في تطبيق واحد، هذا يعني أن كل شيء محظور أثناء النوم.في تطبيق متعدد مؤشرات الترابط، سيتم حظر مؤشر الترابط الذي "تنامه" بشكل صريح فقط وستظل سلاسل الرسائل الأخرى تعمل ضمن العملية.
الخيط فقط ما لم تحتوي عمليتك على خيط واحد.
العملية غير قابلة للتشغيل من تلقاء نفسها.فيما يتعلق بالتنفيذ، فإن العملية مجرد حاوية للخيوط.وهذا يعني أنه لا يمكنك إيقاف العملية مؤقتًا على الإطلاق.إنه ببساطة لا ينطبق على العملية.