Добавление моих двух центов здесь - всегда по возможности используйте implements Runnable
. Ниже приведены два оговорки о том, почему вы не должны использовать extends Thread
s
Thread
должен быть сделан final
. По крайней мере, такие методы, как thread.getId()
. См. это обсуждение для ошибки, связанной с расширением Thread
s. См. http://pastebin.com/BjKNNs2G .
public class WaitPuzzle {
public static void main(String[] args) throws InterruptedException {
DoNothing doNothing = new DoNothing();
new WaitForever(doNothing).start();
new WaitForever(doNothing).start();
new WaitForever(doNothing).start();
Thread.sleep(100);
doNothing.start();
while(true) {
Thread.sleep(10);
}
}
static class WaitForever extends Thread {
private DoNothing doNothing;
public WaitForever(DoNothing doNothing) {
this.doNothing = doNothing;
}
@Override
public void run() {
synchronized (doNothing) {
try {
doNothing.wait(); // will wait forever here as nobody notifies here
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Unreachable Code");
}
}
}
static class DoNothing extends Thread {
@Override
public void run() {
System.out.println("Do Nothing ");
}
}
}
Как управляются переменные и память в Python.
blockquote>Автоматически! Нет, действительно, вы просто создаете объект, а виртуальная машина Python обрабатывает необходимую память и где она должна быть помещена в макет памяти.
Имеет ли он стек и кучу и какой алгоритм используется для управления памятью?
blockquote>Когда мы говорим о
CPython
, он использует кучу private heap для хранения объектов. Из документации API CPython C :Управление памятью в Python включает в себя кучу, содержащую все объекты и структуры данных Python. Управление этой частной кучей обеспечивается внутренним менеджером памяти Python. Менеджер памяти Python имеет разные компоненты, которые имеют дело с различными аспектами управления динамическими хранилищами, такими как совместное использование, сегментация, предварительное распределение или кеширование.
blockquote>Рекультивация памяти в основном обрабатывается подсчетом ссылок. То есть, Python VM хранит внутренний журнал о том, сколько ссылок ссылается на объект, и автоматически мусор собирает его, когда больше ссылок не ссылается на него. Кроме того, существует механизм разрыва круговых ссылок (который не может обрабатывать подсчет ссылок) путем обнаружения недоступных «островов» объектов, несколько в обратном порядке для традиционных алгоритмов GC которые пытаются найти все доступные объекты.
ПРИМЕЧАНИЕ: Пожалуйста, имейте в виду, что эта информация является
CPython
конкретной. Другие реализации python, такие какpypy
,iron python
,jython
и другие, могут отличаться друг от друга и от CPython, когда дело доходит до их особенностей реализации. Чтобы понять это лучше, это может помочь понять, что между Python существует семантика (язык) и базовая реализация. Учитывая это знание, существуют ли какие-либо рекомендации по управлению памятью для большого количества / data crunching?
blockquote>Теперь я не могу говорить об этом, но я уверен, что NumPy (самая популярная библиотека python для хруста числа) имеет механизмы, которые обрабатывают память
Если вы хотите узнать больше о внутренних языках Python, посмотрите на эти ресурсы:
- Шаг через CPython (видео )
- Презентация о внутренних компонентах виртуальной машины Python
- В истинном хакерском духе исходный код CPython Object Allocator
Python не имеет любой такой вещи.
Python - это язык и не указывает, насколько точно реализованы реализации должен достичь семантики, определяемой языком Python.
Каждая реализация (CPython, PyPy, IronPython, Stackless , Jython ...) свободна в том, чтобы делать свое дело!
В C Python, все объекты живут в куче:
Управление памятью в Python включает в себя частную кучу, содержащую все объекты и структуры данных Python.1
blockquote>Виртуальная машина CPython основана на стеках:
>>> def g(): x = 1 y = 2 return f(x, y) >>> import dis >>> dis.dis(g) 2 0 LOAD_CONST 1 (1) # Push 1 onto the stack 3 STORE_FAST 0 (x) # Stores top of stack into local var x 3 6 LOAD_CONST 2 (2) # Push 2 onto stack 9 STORE_FAST 1 (y) # Store TOS into local var y 4 12 LOAD_GLOBAL 0 (f) # Push f onto stack 15 LOAD_FAST 0 (x) # Push x onto stack 18 LOAD_FAST 1 (y) # Push y onto stack 21 CALL_FUNCTION 2 # Execute function with 2 # f's return value is pushed on stack 24 RETURN_VALUE # Return TOS to caller (result of f)
Имейте в виду, что это специфичный для CPython. Стек не содержит фактических значений , хотя он сохраняет ссылки на эти объекты.
1: Источник