ctypes를 사용하여 포인터를 전달하는 dll 함수를 호출하는 Python 프로그램이 있습니다. 그 포인터에 계속적으로 데이터를 쓰는 것으로 가정하고 프로그램이 포인터 내용을 반복하고 읽길 원합니다. 내 특정한 경우에, C로 작성과 문자 배열에 스트림으로 데이터를 실행하고, 파일을 열고 그것을 디코딩,Python에서 dll 함수를 병렬로 호출하는 방법
from ctypes import *
import copy
lib = cdll.lib
pointer = c_char_p(" "*100) #however large a buffer I need
#thread this
lib.dostuff(pointer)
#end thread
while True:
data = pointer.value
print data
dostuff() : 거친 템플릿과 같을 것이다.
문제는 파이썬에서 일반 스레드 모듈을 사용할 수 없다는 것입니다. 왜냐하면 스레드가 GIL을 보유하고 있기 때문에 dll을 읽는 것이 파일 I/O로 간주되거나 dll 자체가 I/O 파일을 수행하기 때문입니다. 따라서 dostuff()가 완료 될 때까지 루프가 실행되지 않습니다. 블록하는 이유는 무엇입니까 (dll 호출은 항상 차단됩니까?) 어떻게이 문제를 해결할 수 있습니까?
편집 : ---------- 솔리드 ---------------------- 샘플 바이어스가 아래에서 지적하므로 ctypes는 GIL 자물쇠. 내 프로그램에서 차단 문제는 내가 대기열을 실행하는 것을 것을 발견 : 코드는 다음과
import Queue
from threading import Thread
queue = Queue()
def runthread():
lib.dostuff(pointer)
while True:
queue.put(pointer.value)
thread = Thread(target=runthread)
thread.start()
while True:
data = queue.get()
dostuffwithdata(data)
프로그램 같은 비트가 차단 된 모습 때문에 큐가 될 때까지 비어 queue.get() 블록 뭔가가 안에 들어간다! 물론, dll 호출을 단독으로 처리하지 않았으므로 포인터 결과를 대기열로 보내기 전에 처리가 완료되었습니다. 해결책은 다음과 같이 보입니다.
import Queue
from threading import Thread
queue = Queue()
def runthread():
q = Thread(target=lib.dostuff, args=(pointer,))
q.start()
while True:
queue.put(pointer.value)
thread = Thread(target=runthread)
thread.start()
while True:
data = queue.get()
dostuffwithdata(data)
이 정보가 도움이되기를 바랍니다.
당신은'lib.dostuff을 포함 할 수 있습니다()', 그것은 막고 코드이기 때문에. – nmichaels
exploing dostuff()에 조금 더 편집 됨 : P –