Home

Tags

python thread

2010-02-13 python threading потоки thread

Потоки (threads) Python, используются для параллельного выполнения блокирующих операций, вызов "внешних" функций, чаще всего используется для распараллеливания работы с сетью (работа с http/web, подключение к БД и т.п.) т.к. это может на длительное время заблокировать поток. Сам питоновский код (вызов функций, математические операции и т.п.) не работает параллельно (см. GIL), поэтому нет смысла пихать в разные потоки тяжелые математические вычисления, для этого можно использовать multiprocessing, либо специальные математические библиотеки например NumPy, SciPy.

Пример обычного использования потоков

Проверено в python 2.7 и 3.2 (linux)

import threading

class TestThread(threading.Thread):
    def run(self):
        print('my name',self.getName()) # получить имя потока

test = TestThread()
test.setName('my proc') # задать имя потока (необязательно)
test.setDaemon(True) # сделать поток демоном
test.start()
setName - задает имя потоку
setDaemon(True) - делает поток демоном, после чего главный поток программы не ждет завершения дочернего и выходит.
isAlive() - определяет живой ли поток

Пример запуска процедуры в отдельный поток

try:
    import thread
except ImportError:
    import _thread as thread
import time

def myThread(param):
    print(param)

thread.start_new_thread(myThread, ('this param',))
time.sleep(0.2)


Ещё вариант:
import threading

def foo(a, b):
    pass

threading.Thread(target=foo, args=("some", "args")).start()

Получить класс текущего потока

В нем можно хранить общие переменные в пределах текущего потока
from threading import currentThread
th = currentThread()
th.tag = 'this tag'


примечание: потоки в питоне (python thread) не дают увеличения производительности, для использования полной мощи процессора можно использовать multiprocessing
Дополнительно смотрите Как использовать локальную память потока

Так же для "параллельного" выполнения кода можно использовать асинхронные фреймворки, в них весь основной код выполняется в одном потоке, а "блокирующие" методы используются в неблокирующем режиме. Часто, приложения использующие такие фреймворки, более эффективны, но они сложнее в разработке. Для примера можете посмотреть асинхронную (однопоточную) загрузку сайтов на tornado.