Потоки в Java и Python - PullRequest
6 голосов
/ 09 июня 2009

У меня есть несколько вопросов о потоках в Python и Java ...

  1. Можно ли дать приоритеты потокам Python, как в Java?
  2. Как я могу убить, остановить, приостановить и прервать поток в Python?
  3. Группы тем - для чего они на самом деле? Поддерживает ли их и Python?
  4. Синхронизация - в Java мы используем просто ключевое слово synchorinized для метода, объекта ... А как насчет Python?

Tnx!

Ответы [ 6 ]

12 голосов
/ 09 июня 2009

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

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

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

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

1 голос
/ 12 июня 2009

Вот пример того, как я разрешаю останавливать мои потоки (действительно работает только для потоков внутри циклов, если вы не хотите помещать 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 голос
/ 10 июня 2009

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

Можно ли дать приоритеты потокам 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 голос
/ 09 июня 2009

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

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

0 голосов
/ 10 июня 2009

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

Существует также потрясающее заявление, которое автоматизирует большинство аспектов использования блокировок. Для примера:

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 голосов
/ 09 июня 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...