سؤال

يبدو أن الخمول (جزء من تثبيت Windows القياسي Python) لن ينفذ برامج متعددة مؤشرات الترابط بشكل صحيح دون تعليق سيئ أو تعطل bugout. لا أحد يعرف طريقة لإصلاح هذا؟

سوف يتم تعليق البرنامج التالي دائمًا في الخمول ولكنه يكتمل بشكل طبيعي عند تنفيذه مع مترجم Python مباشرة:

import threading, time

printLock = threading.Lock()

def pl(s):
  printLock.acquire()
  print s
  printLock.release()

class myThread( threading.Thread ):
  def run(self):
    i = 0
    for i in range(0,30):
      pl(i)
      time.sleep(0.1)

t = myThread()
t.start()

while threading.activeCount() > 1:
  time.sleep(1)
  pl( time.time() )

print "all done!"

إخراج العينة:

U:\dev\py\multithreadtest>python mt.py
0
1
2
3
4
5
6
7
8
9
1277935368.84
10
11
12
13
14
15
16
17
18
19
1277935369.84
20
21
22
23
24
25
26
27
28
29
1277935370.84
1277935371.84
all done!

الإخراج عند استخدام وظيفة "Run Module" الخاملة معلقة دائمًا إلى أجل غير مسمى في وقت قريب ، يظهر الخط الذي يقرأ 23 أو 24 على الجهاز الخاص بي.

هل كانت مفيدة؟

المحلول

Afaik إنه crapshoot عند تشغيل رمز الخيوط في الخمول. يستخدم IDLE GIL بشكل حر ، لذا فإن ظروف السباق والكمال شائع. لسوء الحظ ، أنا لست على دراية جيدة بما يكفي في الخيوط لتقديم نظرة ثاقبة على جعل هذا مؤشر الترابط آمنًا ، بما يتجاوز ما هو واضح.

نصائح أخرى

import threading
print(threading.activeCount())

يطبع 1 عند تشغيله في سطر الأوامر ، 2 عند تشغيله من الخمول. لذلك حلقتك

while threading.activeCount() > 1:
  time.sleep(1)
  pl( time.time() )

سوف ينتهي في وحدة التحكم ولكن يستمر إلى الأبد في الخمول.

لإصلاح المشكلة في الكود المنشور ، أضف شيئًا مثل

initial_threads = threading.activeCount()

بعد الاستيراد وتغيير رأس الحلقة إلى

while threading.activeCount() > initial_threads:

مع هذا التغيير ، يمر الرمز من خلال 30 دورة ويتوقف مع "كل ما تم القيام به!". لقد أضفت هذا إلى قائمة Python وحدة التحكم مقابل الاختلافات الخاملة التي يجب توثيقها.

الخمول لديه بعض المشكلات المعروفة عندما يتعلق الأمر بالخيوط. لا أعرف مبلغًا ساحقًا عن تفاصيل لماذا إنها مشكلة ، لأنني أحاول أن أبتعد عن الخمول ، لكنني أعلم أن الأمر كذلك. أود أن أقترح بشدة أن تذهب للحصول على أدوات IronPython و Python لـ Visual Studio. أدوات تصحيح الأخطاء في VS لا مثيل لها على الإطلاق ، خاصة بالنظر إلى مكتبة الوظائف الإضافية الضخمة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top