2010-01-15 5 views
4

과학 컴퓨팅 분야에서 파이썬 응용 프로그램을 작성 중입니다. 현재 사용자가 GUI로 작업하고 새로운 물리 시뮬레이션을 시작하면 인터프리터는 TraitsMayavi과 같이 시뮬레이션에 필요한 여러 모듈을 즉시 가져옵니다. 이 모듈은 무거 우며 가져 오기에는 너무 오래 걸리고 사용자는 계속하기 전에 ~ 10 초 정도 기다려야합니다.사전 임포트 모듈 용 파이썬 스레드

나는 이것을 고칠 수있는 것으로 생각했다. 나는 그것을 설명 할 것이고 아마도 다른 누군가가 이미 그것을 구현했다. 그렇지 않으면 나는 그것을 스스로 할 수도있다.

내가 원하는 것은 비동기 적으로 모듈을 반입 할 별도의 스레드입니다. 아마도 threading.Thread의 하위 클래스가 될 것입니다.

importer_thread = ImporterThread() 
importer_thread.start() 

# ... 

importer_thread.import('Mayavi') 
importer_thread.import('Traits') 
# A thread-safe method that will put the module name 
# into a queue which the thread in an inifine loop 

# ... 

# When the user actually needs the modules: 
import Mayavi, Traits 
# If they were already loaded by importer_thread, we're good. 
# If not, we'll just have to wait as usual. 

그래서 당신이 이런 일을 알고 않습니다

은 여기에 사용 예제? 그렇지 않다면 디자인에 대한 제안 사항이 있습니까?

+0

당신의 PYTHONPATH는 무엇입니까? 이 모듈들은 어디에 위치해 있습니까? Windows 공유 드라이브 또는 단순히 느린 다른 기능을 사용하고 있습니까? –

+0

아니요, 그들은 보통'site-packages'에 설치됩니다. 로드가 많이 필요하기 때문에 본질적으로 느립니다. 나는 이미 메일 링리스트에서 이것을 논의했다. –

+0

아이디어를 구현할 수있는 명확한 방법이있는 것처럼 보입니다. 왜 그냥 해보지 그래? 비록 키워드이기 때문에 당신이 당신의 메소드를 "import"라고 부를 수 있다고 생각하지는 않습니다. 그리고 대기열은 아마 과잉이다. 앱이 시작될 때 스레드를 시작하고 모듈의 하드 코드 된 목록을 가져 오는 함수를 호출하게 할 수 있습니다. – FogleBird

답변

2

이 문제는 가져 오기가 사용 가능하기 전에 완료해야한다는 점입니다. 응용 프로그램을 처음 사용하는 시점에 따라 응용 프로그램을 10 초 동안 차단해야 어쨌든 시작할 수 있습니다. 모듈을 프로파일 링하는 것이 훨씬 더 생산적이며 인 이유는 무엇입니까? 가져 오기에는 너무 오래 걸립니다.

+1

1. 사용자가 시뮬레이션을 시작할 때까지 사용자가 프로그램을 시작하는 시간 사이에 최소한 몇 초가 지난 것으로 가정합니다. 2. Mayavi와 같은 제 3 자 모듈을 프로파일 링하는 것은 메가 프로젝트입니다. 내면을 자신보다 훨씬 잘 알고있는 사람들이 많이 있습니다. 이미 사람들이 빨리로드하려고 시도했다고 믿습니다. 그리고 나는 그들을 능가하려고 노력하는 것이 좋습니다. 또한 수십 개의 서로 다른 타사 모듈을 사용할 수도 있습니다. –

+0

Posit 1은 예를 들어 배치 프로세서. Posit 2는'__builtins __. import __()'를 무엇을보아야하는지 더 잘 이해할 수 있도록 가져 오기 시작 및 끝 시간을 기록하는 함수로 대체함으로써 도움을받을 수 있습니다. –

-1

는 "사용자가 GUI와 함께 작동하고 새로운 물리 시뮬레이션 시작"

별로 명확합니다. "GUI와 작동"이란 두 번 클릭한다는 의미입니까? 무엇을 두 번 클릭할까요? 일부 wxWidgets GUI 응용 프로그램? 아니면 IDLE?

그렇다면 "새로운 물리 시뮬레이션을 시작합니다"는 의미는 무엇입니까? 버튼을 다른 곳에서 클릭 하시겠습니까? 그들이 코드를 작성하는 패널을 불러오는 GUI 버튼? 아니면 그들이 줄을 쓴 스크립트를 가져 오나요?

시뮬레이션을 시작하기 전에 가져 오기가 왜 발생합니까? 시뮬레이션에 소요되는 시간은 얼마나됩니까? GUI는 무엇을 보여줍니까?

큰 수입을하는 데 훨씬 더 게으른 방법이 있다고 생각합니다. 그러나 설명에서 가져 오기가 사용자에게별로 중요하지 않은 시점이 있는지 판단하기가 어렵습니다.

스레드가별로 도움이되지 않습니다. UI 경험을 재고하는 데 도움이되는 것은 무엇입니까?

+0

Photoshop을 어떻게 시작했는지 알면 새 이미지를 시작할 수 있습니까? 여기와 같아. 프로그램을 시작한 다음 몇 가지 메뉴 항목이나 버튼을 통해 새로운 시뮬레이션을 시작합니다. (wxPython 기반입니다.) 코드를 작성하는 패널을 불러 오지 않습니다. 시뮬레이션은 이미 시작할 준비가되었습니다. (기성품입니다.) 그래서 시뮬레이션을 생성 할 때 타사 모듈이 완전히로드되어야합니다. –

+0

-1. 때로는 선들 사이를 읽고 너무 힘들어하지 않아야합니다. 그가 의미하는 바를 이해하는 것이 그렇게 어렵지 않았습니다. 또한 이것은 대답보다는 논평에 더 가깝습니다. – FogleBird

+0

@FogleBird 나는 선들 사이의 독서와 다른 가정들을 만드는 것이 많은 문제들의 근본 원인이라는 것을 알았다. 나는 실수가 요구 사항이나 디자인 타임에 잘못된 가정과 라인 사이에서 읽혀지기 때문에 질문하고 세부 사항을 얻는 것을 선호한다. 나는 그 단단한 머리를하는 어리 석음이 그들이 고정 될 수있는 열린 곳으로 가정을 얻는 방법이라는 것을 알게됩니다. –

2

왜 앱을 시작할 때이 작업을 수행하지 않습니까?

def background_imports(): 
    import Traits 
    import Mayavi 

thread = threading.Thread(target=background_imports) 
thread.setDaemon(True) 
thread.start() 
+0

그래, 그게 효과가있다. 나는 좀 더 융통성있는 것을 원한다. 나는 당신의 충고를 받아들이고 그것을 직접 구현하려고 노력할 것이라고 생각합니다. (내가 물었던 이유는 가능한 경우 바퀴를 재발 명하는 것을 피하는 것입니다.) –

+1

더 유연하게 어떤 방법으로? – FogleBird

+0

솔직히 말해서 나는 잘 모르겠다. 예를 들어, 프로그램이 simpack 라이브러리를 스캔하고, 필요한 모듈을 미리 가져 오기를 원할 수 있습니다. 하지만 그것은 단지 예일뿐입니다. 구현 한 다음 어떻게되는지 봅니다. –

1

일반적인 아이디어는 좋지만, 백그라운드 스레드 멀리 보내고 import 동안 파이썬/GUI 세션은 모두 응답하지 않을 수 있습니다; 안타깝게도 import은 필연적으로 필연적으로 파이썬을 실질적으로 "잠급니다"(이는 GIL이 아니라 가져 오기를위한 별도의 추가 잠금 기능입니다).

노력 여전히 가치가 조금 더 나은 일을 할 수있는로 - Queue의이 Queueputget 외에, 본질적으로 스레드 안전하고 있기 때문에이 또한 매우 쉽다는 당신이 필요 기본적이다 __import__. 그래도 이것이 도움이되지 않으면 여전히 여분의 행동이 필요하다면 놀라지 마십시오.

본질적으로 매우 빠르지 만 제한된 공간 (예 : "RAM 드라이브"또는 특히 멋쟁이 솔리드 스테이트 드라이브)이있는 드라이브는 필요한 패키지를 .tar.bz2 (또는 다른 형식 (즉, 압축 파일의 압축을 풀고 프로그램을 시작할 때 빠른 드라이브에 압축을 풀면 (기본적으로 I/O이므로 이 잘못 처리하지 않습니다.) I/O 작업이 GIL을 빠르게 해제합니다. tar xjf 등을 실행하는 하위 프로세스에 위임).

가져 오기 느림의 일부 .py/.pyc/.pyo 파일의 거대한 숫자에 의한 경우

, 그것은 (시도 그 ZipFile를 (단 .pyc 형태 , .py하지에) 거기에서 가져 오기를 유지하는 가치가 있지만, OS, 파일 시스템 및 드라이브에 따라 I/O 오버 헤드 만이 도움이됩니다. 거대한 DLL로드 또는 로드 시간에 초기화 코드를 실행하면 지연이 발생하지 않으므로 도움이되지 않습니다. 느림).

또한 응용 프로그램을 multiprocessing (다시 말하면 다중 처리 종류)을 사용하여 통신으로 분할하여 수입 및 일부 무거운 계산이 몇 가지 보조 프로세스로 위임되어 비동기 동시에 여러 코어를 완벽하게 활용할 수 있습니다). 아마도 불행히도 시각화 작업 (예 : mayavi로 작업하는 것과 같은 작업)을 제대로 처리하는 것이 어려울 수도 있지만 "순수한 무거운 계산"패키지 및 작업이있는 경우 도움이 될 것으로 생각됩니다.

+0

당신이 옳았습니다. 나는 그것을 구현했고 간신히 도왔다. 가져 오기가 별도의 스레드에서 수행되었지만 주 스레드가 응답하지 않아 GUI가 중단되었습니다. 파일 이동과 관련된 다른 솔루션이 너무 복잡 할 것이라고 생각합니다. 나는 이미'다중 처리 (multiprocessing) '를 사용하고 있는데, 나는 이것이 도움이 될 것이라고 생각하지 않는다. 다른 방법이 있습니까? 어쩌면 wxPython 루프가 약간의 컨트롤을 가져올 수 있고 UI의 응답 성을 유지할 수 있도록 몇 가지 포인트에서 가져 오기 프로세스를 일시 중지 할 수 있습니까? 이것이 파이썬의 내재 된 약점이라고 생각합니까? –

+0

GUI를 처리하는 프로세스와 다른 프로세스에서'import'를하면 GUI의 응답성에 영향을 줄 수 없습니다. 그래서 여러분이 "유지하는 데 도움이 될 것이라고 생각하지 않는다"는 주장에 완전히 불만을 토로합니다 응답하는 GUI. ** 어떻게 도와 드릴 수 있습니까? ** –

+0

별도의 프로세스에서 가져 오기를 수행하면 GUI 프로세스가 완전히 해제되지만 GUI 프로세스에서 모듈을 사용할 수 있어야한다는 데 동의합니다. 현재 Mayavi는 가장 무겁고 GUI 프로세스에서 꼭 필요합니다. 별도의 프로세스에서 모듈을 가져올 수있는 방법이 있으며 GUI 프로세스에서 모듈을 사용할 수있는 방법이 있다고 제안 하시겠습니까? –