Многопроцессорные слушатели и клиенты между python и pypy - PullRequest
5 голосов
/ 28 декабря 2011

Возможно ли иметь серверный процесс и клиентский процесс , где один из них использует интерпретатор python, а другой pypy интерпретатор?

Будет лиconn.send() и conn.recv() хорошо взаимодействуют?

1 Ответ

10 голосов
/ 28 декабря 2011

Я попробовал, чтобы увидеть:

import sys
from multiprocessing.connection import Listener, Client

address = ('localhost', 6000)

def client():
    conn = Client(address, authkey='secret password')
    print conn.recv_bytes()
    conn.close()

def server():
    listener = Listener(address, authkey='secret password')
    conn = listener.accept()
    print 'connection accepted from', listener.last_accepted
    conn.send_bytes('hello')
    conn.close()
    listener.close()

if __name__ == '__main__':
    if sys.argv[1] == 'client':
        client()
    else:
        server()

Вот результаты, которые я получил:

  • CPython 2.7 + CPython 2.7: работает
  • PyPy 1.7 + PyPy 1.7: работает
  • CPython 2.7 + PyPy 1.7: не работает
  • CPython 2.7 + PyPy Nightly (pypy-c-jit-50911-94e9969b5f00-linux64): работает

При использовании PyPy 1.7 (неважно, какой сервер, а какой клиент), об ошибке сообщается с IOError: bad message length. Это также отражает отчет в списке рассылки pypy-dev . Однако, это было недавно исправлено (это работает в ночной сборке), поэтому в следующей версии (предположительно 1.8) это должно быть исправлено.

В общем, это работает, потому что в многопроцессорном модуле используется модуль Python pickle , который стабилен и поддерживается в нескольких реализациях Python, даже PyPy.

...