win32file - win32api python documentation
¿Cuál es la mejor manera de transferir datos de python a otra aplicación en Windows? (4)
Estoy desarrollando una aplicación con un equipo en .Net (C ++) y proporciono una interfaz COM para interactuar con python y otros lenguajes.
Lo que hemos encontrado es que empujar datos a través de COM resulta ser bastante lento.
He considerado varias alternativas:
- volcar datos en un archivo y enviar la ruta del archivo a través de com
- Memoria compartida a través de mmap ?
- Transmitir datos a través de un socket directamente?
Según su experiencia, ¿cuál es la mejor forma de transmitir datos?
+1 en las canalizaciones con nombre, pero también me gustaría añadir que a partir de sus comentarios parece que su aplicación es muy hablador. Cada vez que realiza una llamada remota, sin importar qué tan rápido sea el transporte subyacente, tiene un costo fijo de recopilación de datos y conexión. Puede ahorrar una gran cantidad de sobrecarga si cambia el método addpoint (lat, long) a un método addpoints (point_array). La idea es similar a por qué tenemos grupos de conexiones de bases de datos y conexiones http-keep-alive. Cuantas menos llamadas reales hagas, mejor. Su solución COM existente puede ser lo suficientemente buena si solo puede limitar la cantidad de llamadas que realiza sobre ella.
No debería ser demasiado complicado establecer una prueba para cada una de sus alternativas y hacer un punto de referencia. Notando supera datos empíricos sensibles al contexto ... :)
Ah, y si haces esto, estoy seguro de que mucha gente estaría interesada en los resultados.
XML / JSON y un servicio web o directamente a través de un socket. También es independiente del lenguaje y la plataforma, por lo que si decides que deseas alojar la porción de python en UNIX, puedes hacerlo, o si quieres usar Java o PHP de forma repentina o casi cualquier otro idioma que puedas.
Como regla general, los protocolos / arquitecturas propietarios como COM ofrecen más restricciones que beneficios. Esta es la razón por la cual las especificaciones abiertas aparecieron en primer lugar.
HTH
Manteniéndonos dentro de los mecanismos de comunicación entre procesos de Windows, tuvimos una experiencia positiva al usar Windows named pipes . El uso de Windows superpuso IO y el módulo win32pipe de pywin32 .
Puede aprender mucho sobre win32 y python en el libro Python Programming On Win32 .
La parte que envía simplemente escribe en r''//./pipe/mypipe''
.
Un objeto detector ( ovpipe
) contiene un identificador de evento y esperar un mensaje con otros posibles eventos implica llamar a win32event.WaitForMultipleObjects
.
rc = win32event.WaitForMultipleObjects(
eventlist, # Objects to wait for.
0, # Wait for one object
timeout) # timeout in milli-seconds.
Aquí hay parte de la clase de oyentes superpuestos de python:
import win32event
import pywintypes
import win32file
import win32pipe
class ovpipe:
"Overlapped I/O named pipe class"
def __init__(self):
self.over=pywintypes.OVERLAPPED()
evt=win32event.CreateEvent(None,1,0,None)
self.over.hEvent=evt
self.pname=''mypipe''
self.hpipe = win32pipe.CreateNamedPipe(
r''//./pipe/mypipe'', # pipe name
win32pipe.PIPE_ACCESS_DUPLEX| # read/write access
win32file.FILE_FLAG_OVERLAPPED,
win32pipe.PIPE_TYPE_MESSAGE| # message-type pipe
win32pipe.PIPE_WAIT, # blocking mode
1, # number of instances
512, # output buffer size
512, # input buffer size
2000, # client time-out
None) # no security attributes
self.buffer = win32file.AllocateReadBuffer(512)
self.state=''noconnected''
self.chstate()
def execmsg(self):
"Translate the received message"
pass
def chstate(self):
"Change the state of the pipe depending on current state"
if self.state==''noconnected'':
win32pipe.ConnectNamedPipe(self.hpipe,self.over)
self.state=''connectwait''
return -6
elif self.state==''connectwait'':
j,self.strbuf=win32file.ReadFile(self.hpipe,self.buffer,self.over)
self.state=''readwait''
return -6
elif self.state==''readwait'':
size=win32file.GetOverlappedResult(self.hpipe,self.over,1)
self.msg=self.strbuf[:size]
ret=self.execmsg()
self.state = ''noconnected''
win32pipe.DisconnectNamedPipe(self.hpipe)
return ret