2015-05-27 4 views
0

Я играю с некоторыми измерительными приборами через PyVisa (обертка Python для VISA). В частности мне нужно прочитать значение измерения из четырех инструментов, подобных этому:Самый быстрый способ обработки потоков с обратным вызовом в Python

current1 = instrument1.ask("READ?") 
current2 = instrument2.ask("READ?") 
current3 = instrument3.ask("READ?") 
current4 = instrument4.ask("READ?") 

Для моего приложения, скорость является обязательной. Индивидуально, я могу получить от 50 до 200 измерений в секунду от четырех инструментов, но, к сожалению, мой текущий код оценивает четыре инструмента последовательно.

Из того, что я прочитал, есть некоторые варианты с Threading и Multiprocessing в Python, но не очевидно, какой лучший и самый быстрый вариант для меня. Лучший сценарий для случая я буду нереститься ~ 4x50 потоков в секунду, поэтому накладные расходы немного обеспокоены.

Задача ни в коем случае не требует интенсивного процессора, это просто вопрос ожидания считывания с инструмента.

Любые советы относительно того, что может быть надлежащим образом действий?

Большое спасибо заранее!

+0

Почему не 4 статических потоков, каждый смотрит на одном инструменте постоянно? Таким образом, вам не нужно создавать и присоединяться к потокам. – Loocid

+0

Вы можете попробовать threadpool. Таким образом, вы не получаете никаких накладных расходов на поток. – Pithikos

+0

@Loocid Я не уверен, что вы подразумеваете под статическими потоками для python, но мне нужно одновременно прочитать четыре значения, то есть даже для моего наилучшего случая сценарий я всегда буду ограничен самым медленным потоком. Но это прекрасно, если мне не нужно читать с инструментов в серийном порядке! =) – Bjarke

ответ

0

Пробуйте использовать модуль multiprocessing в python. Из-за того, как написан python-интерпретатор, модуль потоковой передачи для python фактически замедляет ваше приложение при использовании нескольких потоков на компьютере с несколькими процессорами. Это связано с чем-то, называемым Global Interpreter Lock (GIL), который позволяет одновременно запускать один поток python для каждого процесса. Это упрощает работу с интерпретатором управления памятью и параллелизмом.

Я бы предложил попробовать создать процесс для каждого инструмента (процесс производителя) и отправить результаты в общую очередь, которая обрабатывается одним процессом (потребительским процессом).

Я бы также ограничил количество процессов, которые вы создали, на количество процессоров на вашем компьютере. Создание слишком большого количества процессов приводит к большим накладным расходам.

Если вы действительно чувствуете, что вам нужны 200 тем, которые вы предложили в своем посте, я бы запрограммировал это на Java или C++.

+0

Мне понадобится, вероятно, не 200 потоков одновременно, а 4 потока.Когда самый медленный инструмент вернет свое значение, я тогда прочитаю эти значения и создаст 4 новых потока. – Bjarke

0

Я не уверен, что это соответствует вашим требованиям. Я не слишком хорошо знаком с pyVisa, однако вы заглянули в бесчисленные примеры pypy, скорость увеличения довольно впечатляющая, и вы можете порождать почти бесконечное количество " нитки », не сильно мешая вашей системе/программе.

pypy является ограниченным с точки зрения поддержки различных пакетов, но, похоже, pyVisa не является одним из них.

https://pypi.python.org/pypi/PyVISA

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