Потоки в Java и Python

Попробуйте это:

function getRandomColor() {
    var letters = '0123456789ABCDEF'.split('');
    var color = '#';
    for (var i = 0; i < 6; i++ ) {
        color += letters[Math.round(Math.random() * 15)];
    }
    return color;
}

Посмотрите это в действии: http://jsfiddle.net/3wjgG/1/

6
задан Jason Coon 9 June 2009 в 15:56
поделиться

6 ответов

Предполагая, что мы говорим о классической реализации (CPython):

  1. нет, нет приоритетов в потоках Python
  2. вы не можете делать ничего из этого с потоком в Python
  3. нет групп потоков в Python
  4. вы можете использовать множество подходов, таких как блокировки, но обычно рекомендуется использовать модуль Queue из стандартной библиотеки (и ограничивать взаимодействие ваших потоков тем, что Queue позволяет вам программировать)

Другими словами, потоки Python на самом деле намного менее богаты, чем потоки Java - не говоря уже о том, что только один поток на процесс может фактически запускать код Python (другие могут запускать код C или ждать).

Для чего угодно. , т.е. все, что выходит за рамки ограниченных возможностей потоковой передачи Python,я рекомендовал вам использовать модуль multiprocessing из стандартной библиотеки - или переключиться на реализации Python, которые позволяют использовать более широкие подходы к многопоточности, такие как Jython для JVM или IronPython для .NET.

12
ответ дан 8 December 2019 в 16:09
поделиться

На обычные приоритеты потоков Java нельзя рассчитывать. Вы можете обнаружить, что поток с более низким приоритетом работает, когда поток с более высоким приоритетом готов и ожидает.

Существует нечто, называемое «Java реального времени» (см. http://www.rtsj.org ), которое обеспечивает соблюдение приоритета потока, по крайней мере, для класса RealtimeThread. Обычный java.lang.Thread может по-прежнему не обеспечивать истинный порядок приоритетов.

1
ответ дан 8 December 2019 в 16:09
поделиться

Сделайте небольшой шаг в отношении пункта 1, потому что приоритеты Java Thread могут работать не так, как можно было бы ожидать.

Из руководства SCJP:

Поскольку поведение приоритета планирования потоков не гарантируется, используйте приоритеты потоков как способ повышения эффективности вашей программы, но просто убедитесь, что ваша программа не зависит от этого поведения для правильности.

0
ответ дан 8 December 2019 в 16:09
поделиться

К сожалению, в стандартном пакете Python есть так называемая GIL, или глобальная блокировка интерпретатора. Это означает, что одновременно будет работать только один из ваших потоков. При этом возможны простые многопоточные приложения, и их довольно легко написать. Модуль многопоточности содержит базовые примитивы синхронизации, такие как мьютексы, семпахоры и т. Д.

Существует также замечательный оператор with, который автоматизирует большинство аспектов использования блокировок. Например:

import threading
myLock = threading.Lock()

Затем, чтобы использовать блокировку:

with myLock:
    #lock has now been acquired
    print "I have the lock and can now to fun stuff"
print "The lock has been released"
0
ответ дан 8 December 2019 в 16:09
поделиться

Я почувствовал необходимость развенчать распространенные мифы, увековеченные здесь:

Можно ли отдавать приоритеты потокам Python, как в Java?

Не в смысле ОС. Но вы можете использовать совместную многозадачность и собственный настраиваемый планировщик, чтобы определенные потоки использовали больше времени. Вы также можете установить временные интервалы между потоками следующим образом:

http://docs.python.org/library/sys.html#sys.setcheckinterval

Как я могу убить, остановить, приостановить и прервать поток в Python ?

Обратите внимание, что вы можете это сделать. Это просто сложно, и люди будут философствовать о том, насколько это зло. Но это верно для любого языка. Вы можете использовать следующую функцию API:

http://docs.python.org/c-api/init.html#PyThreadState_SetAsyncExc

Или вы можете использовать свою базовую ОС, такую ​​как TerminateThread, в окнах за пределами TID. Только не забудьте установить глобальную блокировку.

Группы потоков - для чего они на самом деле? Поддерживает ли их Python тоже?

Я так не думаю. Они предназначены для управления группами потоков.

Синхронизация - в Java мы используем просто ключевое слово synchorinized для метода, объекта ... А как насчет Python?

Прочтите модуль потоков и потоков.

1
ответ дан 8 December 2019 в 16:09
поделиться

вот пример того, как я разрешаю останавливать потоки (на самом деле работает только для потоков внутри циклов, если вы не хотите помещать if "self.alive" перед каждой строкой):

import threading, Queue

class HaltableThread(object.Thread):
    def __init__(self):
        self.stringQueue = Queue.Queue()
        self.alive = True
    def run(self):
        while self.alive:
            try:
                data = self.stringQueue.read(0.01) #100ms block until data
            except Queue.Empty:
                pass
            else:
                print data
    def stop(self):
        self.alive = False
1
ответ дан 8 December 2019 в 16:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: