11.7 在��的Python解释器之间交互¶
问题¶
ä½ åœ¨ä¸�å�Œçš„æœºå™¨ä¸Šé�¢è¿�行ç�€å¤šä¸ªPython解释器实例,并希望能够在这些解释器之间通过消æ�¯æ�¥äº¤æ�¢æ•°æ�®ã€‚
解决方案¶
通过使用 multiprocessing.connection 模��以很容易的实现解释器之间的通信。
下é�¢æ˜¯ä¸€ä¸ªç®€å�•çš„åº”ç”æœ�务器例å�:
from multiprocessing.connection import Listener
import traceback
def echo_client(conn):
try:
while True:
msg = conn.recv()
conn.send(msg)
except EOFError:
print('Connection closed')
def echo_server(address, authkey):
serv = Listener(address, authkey=authkey)
while True:
try:
client = serv.accept()
echo_client(client)
except Exception:
traceback.print_exc()
echo_server(('', 25000), authkey=b'peekaboo')
然�客户端连接�务器并��消�的简�示例:
>>> from multiprocessing.connection import Client
>>> c = Client(('localhost', 25000), authkey=b'peekaboo')
>>> c.send('hello')
>>> c.recv()
'hello'
>>> c.send(42)
>>> c.recv()
42
>>> c.send([1, 2, 3, 4, 5])
>>> c.recv()
[1, 2, 3, 4, 5]
>>>
跟底层socketä¸�å�Œçš„æ˜¯ï¼Œæ¯�个消æ�¯ä¼šå®Œæ•´ä¿�å˜ï¼ˆæ¯�一个通过send()å�‘é€�的对象能通过recv()æ�¥å®Œæ•´æŽ¥å�—)。 å�¦å¤–,所有对象会通过pickleåº�åˆ—åŒ–ã€‚å› æ¤ï¼Œä»»ä½•兼容pickle的对象都能在æ¤è¿žæŽ¥ä¸Šé�¢è¢«å�‘é€�和接å�—。
讨论¶
ç›®å‰�有很多用æ�¥å®žçްå�„ç§�消æ�¯ä¼ 输的包和函数库,比如ZeroMQã€�Celeryç‰ã€‚
ä½ è¿˜æœ‰å�¦å¤–一ç§�选择就是自己在底层socket基础之上æ�¥å®žçŽ°ä¸€ä¸ªæ¶ˆæ�¯ä¼ 输层。
ä½†æ˜¯ä½ æƒ³è¦�简å�•一点的方案,那么这时候 multiprocessing.connection 就派上用场了。
仅仅使用一些简å�•çš„è¯å�¥å�³å�¯å®žçŽ°å¤šä¸ªè§£é‡Šå™¨ä¹‹é—´çš„æ¶ˆæ�¯é€šä¿¡ã€‚
å¦‚æžœä½ çš„è§£é‡Šå™¨è¿�行在å�Œä¸€å�°æœºå™¨ä¸Šé�¢ï¼Œé‚£ä¹ˆä½ å�¯ä»¥ä½¿ç”¨å�¦å¤–的通信机制,比如UnixåŸŸå¥—æŽ¥å—æˆ–者是Windows命å��管é�“。 è¦�想使用UNIXåŸŸå¥—æŽ¥å—æ�¥åˆ›å»ºä¸€ä¸ªè¿žæŽ¥ï¼Œå�ªéœ€ç®€å�•的将地å�€æ”¹å†™ä¸€ä¸ªæ–‡ä»¶å��å�³å�¯ï¼š
s = Listener('/tmp/myconn', authkey=b'peekaboo')
è¦�想使用Windows命å��管é�“æ�¥åˆ›å»ºè¿žæŽ¥ï¼Œå�ªéœ€åƒ�下é�¢è¿™æ ·ä½¿ç”¨ä¸€ä¸ªæ–‡ä»¶å��:
s = Listener(r'\\.\pipe\myconn', authkey=b'peekaboo')
ä¸€ä¸ªé€šç”¨å‡†åˆ™æ˜¯ï¼Œä½ ä¸�è¦�使用 multiprocessing æ�¥å®žçŽ°ä¸€ä¸ªå¯¹å¤–çš„å…¬å…±æœ�务。
Client() å’Œ Listener() ä¸çš„ authkey å�‚数用æ�¥è®¤è¯�å�‘起连接的终端用户。
如果密钥ä¸�对会产生一个异常。æ¤å¤–,该模å�—最适å�ˆç”¨æ�¥å»ºç«‹é•¿è¿žæŽ¥ï¼ˆè€Œä¸�是大é‡�çš„çŸè¿žæŽ¥ï¼‰ï¼Œ
例如,两个解释器之间å�¯åЍå�Žå°±å¼€å§‹å»ºç«‹è¿žæŽ¥å¹¶åœ¨å¤„ç�†æŸ�个问题过程ä¸ä¼šä¸€ç›´ä¿�æŒ�连接状æ€�。
å¦‚æžœä½ éœ€è¦�对底层连接å�šæ›´å¤šçš„æŽ§åˆ¶ï¼Œæ¯”å¦‚éœ€è¦�支æŒ�è¶…æ—¶ã€�é�žé˜»å¡žI/O或其他类似的特性, ä½ æœ€å¥½ä½¿ç”¨å�¦å¤–的库或者是在高层socket上æ�¥å®žçŽ°è¿™äº›ç‰¹æ€§ã€‚