2015-08-08 2 views
0

У меня есть требование, которое требует от меня запускать 480 потоков и 16 процессов (каждый процесс будет иметь 30 потоков, поэтому это 480). Я слышал, что из-за GIL у python нет хорошей поддержки многопоточности! Есть ли способ эффективно выполнить приложение с указанными выше требованиями в python? Заранее спасибо.Python многопоточность, многопроцессорная обработка

+0

Зачем вам так много потоков в первую очередь? –

+0

Сложный ... Я настраиваю симулятор POS (точки продажи) .... Код написан на C (сервере) Я должен вызывать функции из python (на стороне клиента) через сокеты! Итак ... –

+0

Существует хороший [набор слайдов] (http://www.dabeaz.com/python/UnderstandingGIL.pdf), показывающий, как GIL вмешивается в потоки. – meuh

ответ

0

Это должно дать вам представление о том, как это делается.

import multiprocessing 
import threading 

def thread(): 
    pass 


def process(): 
    threads = [] 
    for i in range(30): 
     t = threading.Thread(target=thread) 
     threads.append(t) 
     t.start() 
    for t in threads: 
     t.join() 

if __name__ == '__main__': 
    processes = [] 
    for i in range(16): 
     p = multiprocessing.Process(target=process) 
     processes.append(p) 
     p.start() 
    for p in processes: 
     p.join() 
+0

К сожалению, операции более интенсивные для ЦП, чем I/O, и код в чистом питоне! Хорошо ли идти с питоном или выбрать какой-то другой язык? –

+0

Если вам просто нужно многопоточность b/c сокетов, прочтите следующее: https://docs.python.org/2/library/asyncore.html – Ayy

+0

Разве вы не сказали, что POS-симулятор написан на C, а Python будет отправлять только запрашивает его через сокеты? Похоже, что это сервер, который будет делать тяжелую работу? Пожалуйста, уточните, спасибо. – plamut

2

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

Однако, если ваши потоки связаны с I/O-привязкой, то есть большую часть времени, ожидая ввода/вывода, GIL не будет проблемой, потому что, ожидая завершения операции ввода-вывода, потоки могут выполнять не требуется блокировка интерпретатора Python. Примером может служить ожидание завершения сетевой операции (например, загрузка файла). Вы можете легко запускать несколько потоков и одновременно загружать файлы.

* примечание: даже для задач с привязкой к ЦП GIL применяется только к Код Python. Если поток использует C-расширение (т. Е. Библиотеку, написанную на C), он не будет нуждаться в GIL во время выполнения, потому что он не будет выполнять инструкции Python.

Редактировать: Чтение вашего комментария о том, что вы будете активировать функции имитации POS через сокеты ... это операция ввода-вывода. Пока сервер будет выполнять вызовы функций, Python (клиент) просто будет ничего не делать, и потокам не потребуется большую часть времени удерживать GIL.

Смежные вопросы