Я хотел бы способствовать с простым примером и объяснениями, которые я нашел полезными, когда я должен был заняться этой проблемой сам.
Здесь я вставлю немного полезной информации о GIL и простом повседневном примере (использующий multiprocessing.dummy) и его сравнительные тесты с и без многопоточности.
Глобальная блокировка интерпретатора (GIL)
Python не позволяет многопоточность в самом истинном значении слова. Это имеет пакет многопоточности, но если Вы хотите мультираспараллелить для ускорения кода, тогда это обычно - не хорошая идея использовать его. Python имеет конструкцию, названную Глобальной блокировкой интерпретатора (GIL). GIL удостоверяется, что только один из Ваших 'потоков' может выполниться в любой момент. Поток получает GIL, действительно немного работает, затем передает GIL на следующий поток. Это происходит очень быстро так с человеческим глазом, может казаться, что Ваши потоки выполняются параллельно, но они действительно просто сменяются с помощью того же ядра процессора. Вся эта передача GIL добавляет наверху к выполнению. Это означает, что, если Вы хотите сделать свой код выполненным быстрее тогда с помощью пакета поточной обработки часто, не хорошая идея.
существуют причины использовать пакет поточной обработки Python. Если Вы хотите выполнить некоторые вещи одновременно, и эффективность не является беспокойством, то она прекрасна полностью и удобна. Или если Вы выполняете код, который должен ожидать чего-то (как некоторый IO) тогда, он мог иметь много смысла. Но библиотека поточной обработки не позволит Вам использовать дополнительные ядра процессора.
Многопоточность может быть произведена на стороне к операционной системе (путем выполнения многопроцессорной обработки), некоторое внешнее приложение, которое называет код Python (например, Spark или Hadoop), или некоторый код, который называет код Python (например: у Вас мог быть свой код Python, вызывают функцию C, которая делает дорогой многопоточный материал).
, Почему Это Вопросы
, поскольку много людей проводит много времени, пытаясь найти узкие места в их необычном Python многопоточным кодом, прежде чем они изучат, каков GIL.
, Как только эта информация ясна, вот мой код:
#!/bin/python
from multiprocessing.dummy import Pool
from subprocess import PIPE,Popen
import time
import os
# In the variable pool_size we define the "parallelness".
# For CPU-bound tasks, it doesn't make sense to create more Pool processes
# than you have cores to run them on.
#
# On the other hand, if you are using I/O-bound tasks, it may make sense
# to create a quite a few more Pool processes than cores, since the processes
# will probably spend most their time blocked (waiting for I/O to complete).
pool_size = 8
def do_ping(ip):
if os.name == 'nt':
print ("Using Windows Ping to " + ip)
proc = Popen(['ping', ip], stdout=PIPE)
return proc.communicate()[0]
else:
print ("Using Linux / Unix Ping to " + ip)
proc = Popen(['ping', ip, '-c', '4'], stdout=PIPE)
return proc.communicate()[0]
os.system('cls' if os.name=='nt' else 'clear')
print ("Running using threads\n")
start_time = time.time()
pool = Pool(pool_size)
website_names = ["www.google.com","www.facebook.com","www.pinterest.com","www.microsoft.com"]
result = {}
for website_name in website_names:
result[website_name] = pool.apply_async(do_ping, args=(website_name,))
pool.close()
pool.join()
print ("\n--- Execution took {} seconds ---".format((time.time() - start_time)))
# Now we do the same without threading, just to compare time
print ("\nRunning NOT using threads\n")
start_time = time.time()
for website_name in website_names:
do_ping(website_name)
print ("\n--- Execution took {} seconds ---".format((time.time() - start_time)))
# Here's one way to print the final output from the threads
output = {}
for key, value in result.items():
output[key] = value.get()
print ("\nOutput aggregated in a Dictionary:")
print (output)
print ("\n")
print ("\nPretty printed output:")
for key, value in output.items():
print (key + "\n")
print (value)
.all
связан с событием window.onload
, которое запускается только один раз.
Чтобы выделить синтаксис после загрузки страницы, используйте вместо этого функцию highlight
:
content.load("content/"+this.id+".html", function () {
// this is executed after the content is injected to the DOM
contentContainer.effect("highlight");
SyntaxHighlighter.highlight();
});
Скрестив пальцы, это работает, в противном случае (если посмотреть на код) вам может потребоваться добавить некоторые явные аргументы (где {}
- пустой набор параметров конфигурации, а - это
] будет содержимым
при вызове из обработчика нагрузки ajax):
SyntaxHighlighter.highlight({}, this);
Вам нужно вызвать это в обратном вызове для загрузки:
content.load("content/"+this.id+".html",function() {
SyntaxHighlighter.all();
});
load является асинхронным, поэтому он успешно продолжает выполнение операторов, пока запрос GET выполняется в фоновом режиме.