2012-03-18 1 views
3

측정을 수행하고 측정을 수행하고 싶습니다. 측정 값은 입니다. 이 측정은 Python에서 꽤 오랜 시간이 걸립니다 (느린 연결을 통해 데이터를 검색해야 함). 문제는 측정 할 때 그래프가 정지한다는 것입니다. 측정 은 중심 파장을 설정 한 다음 일부 신호를 측정하는 것으로 구성됩니다. 이 , 스위치하지만 측정이 실행되는 동안 그림은 동결됩니다 -pylab 모듈 IPython에서 실행될 때이 작동합니다시간이 걸리는 측정을 수행하는 동안 matplotlib에 플로팅 라이브

# this is just some arbitrary library that has the functions set_wavelength and 
# perform_measurement 
from measurement_module import set_wavelength, perform_measurement 
from pylab import * 

xdata = np.linspace(600,1000,30) # this will be the x axis 
ydata = np.zeros(len(xdata)) # this will be the y data. It will 
for i in range(len(xdata)): 
    # this call takes approx 1 s 
    set_wavelength(xdata[i]) 
    # this takes approx 10 s 
    ydata[i] = perform_measurement(xdata) 
    # now I would like to plot the measured data 
    plot(xdata,ydata) 
    draw() 

:

내 프로그램은 다음과 같이 보입니다. 측정하는 동안 대화 형 플롯을 갖는 동작을 어떻게 수정할 수 있습니까?

측정을 수행하는 동안 python이 사용 중이므로 pylab.ion()을 사용할 수 없습니다.

관련,

더크

답변

0

느린 입력 및 출력은 파이썬에서 스레드 및 큐를 사용하는 완벽한 시간이다. 스레드에는 한계가 있지만,이 스레드는 쉽고 효과적으로 작동합니다.

수행 방법 개요 :
일반적으로 GUI (예 : matplotlib 창)는 주 스레드에 있어야하므로 두 번째 스레드에서 데이터 수집을 수행해야합니다. 데이터 스레드에서 새로운 데이터가 들어 오는지 확인하십시오 (그리고 어떤 유형의 무한 폴링 루프에서이를 수행하는 경우 스레드를 가끔 해제하려면 잠시 time.sleep을 넣으십시오). 그런 다음 필요할 때마다 주 스레드가 처리/표시 할 새로운 데이터가 있음을 알립니다. 이 작업을 수행하는 방법은 프로그램 및 GUI 등의 세부 사항에 달려 있습니다. 메인 스레드에서 확인하는 데이터 스레드에서 플래그를 사용하거나 theading.Event를 사용하거나, 예를 들어 matplotlib wx.CallAfter에 대한 wx 백엔드가 쉽습니다. 많은 파이썬 스레딩 자습서 중 하나를 살펴보고 GUI를 사용하는 것이 일반적으로 몇 가지 문제가 있으므로 특정 백엔드로 스레딩 할 때 빠른 Google을 수행하는 것이 좋습니다. 이것은 간단히 설명 할 때 번거롭긴하지만 실제로는 쉽고 강력하며 다른 프로세스에서 같은 파일을 읽고 쓰는 것보다 매끄 럽습니다.

+0

좋아, 그게 내 초기 생각 이었어. 어떻게 그걸 할거야? 플로팅이 별도의 스레드에있는 경우 프로그램이 주 스레드에서 사용 중이므로 도움이되지 않습니다. 예를 들어 주시겠습니까? – Dirklinux

+0

나는 나의 대답에서 더 상세한 개요를 주었다. 여기에 귀하의 질문에 대답 : "프로그램이 메인 스레드에서 바쁠 것"에 대한 귀하의 데이터 수집 하드웨어 제한된 때문에, 귀하의 프로그램은 데이터 수집 스레드에서 정말 "바쁜"아니, 대부분은 단지 데이터를 기다리고있어. 필자가 경험 한 바에 따르면 스레딩은 데이터 수집 프로그램에서 매우 잘 작동하는 경우가 대부분입니다. – tom10

+0

고마워요! 그것을 시도하고 게시 유지. – Dirklinux

1

당신이 할 수있는, 어쩌면 조금 어색 불구하고 serparate 프로세스와 데이터 수집을 실행합니다. 서브 프로세스 모듈에서 Popen이 매우 편리합니다. 그런 다음 해당 데이터 수집 스크립트가 수행하는 작업을 다른 곳의 디스크에 저장하십시오.

Popen.poll() 

완료되었는지 확인하십시오.

작동해야합니다.

+0

응답 해 주셔서 감사합니다.Popen을 사용하여 플로팅 프로그램과 통신 할 수있는 측정 프로그램을 작성하고 Popen.communicate()을 사용하여 측정 데이터를 다시 전송합니다. 그런 식으로 다른 프로그램에 대한 측정 프로그램을 다시 작성하고 동일한 플로팅 프로그램을 사용할 수 있습니다. 하나의 컴퓨터에서 측정하고 다른 컴퓨터에서 결과를 플로팅 할 수 있도록 소켓을 사용할 수도 있습니다. – Dirklinux

1

큰 청크로 데이터를 버퍼링하고 버퍼가 가득 차면 렌더링/다시 렌더링하는 것이 좋습니다. 비 블로킹 (nonblocking)을 원하면 그린 레츠 (greenlets)를보십시오.

from gevent.greenlet import Greenlet 
import copy 
def render(buffer): 
    ''' 
    do rendering stuff 
    ''' 
    pass 

buff = '' 
while not_finished: 
    buff = connection.read() 
    g = Greenlet(render, copy.deepcopy(buff)) 
    g.start() 
0

Enthought 유형 시스템 및 플로팅 라이브러리 TraitsChaco을 살펴보십시오. 그것들은 당신이 뛰어 다니고있는 문제를 해결할 수있는 좋은 추상화를 제공합니다. Chaco 플롯은 종속성이 변경 될 때마다 자체적으로 업데이트됩니다.

관련 문제