2013-11-20 2 views
1

Я нашел tutorial about using multithreading in Python и посмотрел documentation.Предельная производительность Python за нить

Хотя примеры работы, некоторые вопросы возникли.

В JavaScript, бесконечный цикл, как

while (true) { 
    console.log("I'm trapped in an infinite loop!"); // JavaScript nearly crashes. 
} 

разбивает мое исполнение браузера, и я могу избежать только путем прекращения процесса. В Python, однако, бесконечный цикл работает отлично. Я могу остановить его в любое время. Это даже работает в сочетании с другими потоками:

Я думал, что бесконечная петля будет самой утомительной задачей для всех. Если бы это было правильно, это означало бы, что Python позаботится об истощении потоков, чтобы другие потоки не прекращались.

Это мой вопрос: как Python назначает емкость для подстилающих потоков?

try: 
    # How much capacity will thread 1 get? 
    thread.start_new_thread(very_exhausting_task, ("Thread-1",)) 
    # How much capacity will thread 2 get? 
    thread.start_new_thread(another_very_exhausting_task, ("Thread-2",)) 
except: 
    print "Error: unable to start thread" 
while 1: 
    pass 
+1

Необходимо уточнить «Как я могу контролировать емкость?». Формат сайтов поддерживает один вопрос за сообщение. Поэтому, задавая несколько вопросов - каждый из которых может иметь другой ответ, а кто-то из экспертов в ответе может исходить от разных пользователей, следует разделить на несколько вопросов - каждый из которых сосредоточен на своей собственной части. Ваши вопросы кажутся в основном основанными на мнениях, упрямыми ответами, которые вызывают дискуссию и дискуссию, также не подходят для этого сайта. Я рекомендую вам провести независимое исследование и вернуться с солидным вопросом. Или зайдите в [Python Chat] (http://chat.stackoverflow.com/rooms/6/python) –

+1

Кажется, вам не хватает базового понимания концепций потоковой передачи и планирования. Прочтите http://en.wikipedia.org/wiki/Scheduling_%28computing%29, чтобы начать работу; но для того, чтобы подробно ответить на этот вопрос, понадобится хорошая книга или документ о ОС и расписании. Ваш вопрос о том, как назначается пропускная способность, мало смысла - интерпретатор python дает потоку некоторое время процессора и выходит из него с прерыванием; это повторяется, если нить не заканчивается. – l4mpi

+0

Спасибо за ваш комментарий. Я удалил ненужные вопросы и сосредоточился на моем главном вопросе. – Xiphias

ответ

1

«Способность» нить действительно больше вследствие проектных решений, связанных с Глобальной Interpreter Lock (GIL) и характеристиками рабочей нагрузки.

Если вы не знакомы с GIL, этот замок делает так, что только один поток может использовать интерпретатор в любой момент времени. Это наиболее вредно для потоковой передачи чистого кода Python (включая любые используемые библиотеки). Хотя может быть много потоков ОС, только один поток будет эффективно работать в течение заданного временного фрагмента.

Это также влияет на расширения C, которые должны работать с объектами Python. Тем не менее, расширения могут обойти это ограничение, выпустив GIL при выполнении работы с I/O-привязкой (разговор в сети и т. Д.) Или при большой обработке, которая не требует объектов Python.

Я предлагаю вам начать с глядя в https://wiki.python.org/moin/GlobalInterpreterLock и читать эти слайды палубы: http://www.dabeaz.com/python/UnderstandingGIL.pdf и http://www.dabeaz.com/python/GIL.pdf

Вы найдете подробную информацию о некоторых аспектах кооперативной многозадачности (добровольно отпуская GIL) в сочетании с прерываниями собственностей GIL (пробегая мимо отведенное количество инструкций). Последний настраивается (см.: http://docs.python.org/2/library/sys.html#sys.setcheckinterval)

Смежные вопросы