многопроцессорные слушатели и клиенты между python и pypy


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

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

1 5

1 ответ:

Я попробовал посмотреть:

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 . Однако это было недавно исправлено (он работает в nightly build), поэтому в следующей версии (предположительно 1.8) он также должен быть исправлен.

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