Если мы рассмотрим общие сценарии, в которых может быть выбрано это исключение, доступ к свойствам с объектом вверху.
Пример:
string postalcode=Customer.Address.PostalCode;
//if customer or address is null , this will through exeption
здесь, если адрес имеет значение null, то вы получите NullReferenceException.
Итак, в качестве практики мы всегда должны использовать проверку нуля, прежде чем обращаться к свойствам в таких объектах (особенно в общих)
string postalcode=Customer?.Address?.PostalCode;
//if customer or address is null , this will return null, without through a exception
Nah, zeromq - путь. Вкусный, не так ли?
import argparse
import zmq
parser = argparse.ArgumentParser(description='zeromq server/client')
parser.add_argument('--bar')
args = parser.parse_args()
if args.bar:
# client
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect('tcp://127.0.0.1:5555')
socket.send(args.bar)
msg = socket.recv()
print msg
else:
# server
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind('tcp://127.0.0.1:5555')
while True:
msg = socket.recv()
if msg == 'zeromq':
socket.send('ah ha!')
else:
socket.send('...nah')
Я бы использовал сокеты; локальная связь была сильно оптимизирована, поэтому у вас не должно быть проблем с производительностью, и это дает вам возможность распространять ваше приложение на разные физические узлы, если это необходимо.
Что касается «низкого уровня», подход, ты прав. Но вы всегда можете использовать обертку более высокого уровня в зависимости от ваших потребностей. XMLRPC может быть хорошим кандидатом, но это может быть чрезмерным для задачи, которую вы пытаетесь выполнить.
Twisted предлагает несколько хороших простых простейших протоколов , например LineReceiver (для простых сообщений на основе строки) или более элегантный AMP (который, кстати, стандартизирован и реализован на разных языках ).
Я бы использовал сокеты, но использовал Twisted, чтобы дать вам некоторую абстракцию и сделать все просто. Их простой пример Echo Client / Server - хорошее место для начала.
Вам просто нужно объединить файлы и создать экземпляр и запустить клиент или сервер в зависимости от переданного аргумента (с). [/ д2]
Проверьте кросс-платформенную библиотеку / сервер под названием RabbitMQ. Может быть слишком тяжелым для двухпроцессорной связи, но если вам нужна многопроцессорная или многокодовая база данных (с различными различными способами, например, один-ко-многим, очереди и т. Д.), Это хороший вариант.
Требования:
$ pip install pika
$ pip install bson # for sending binary content
$ sudo apt-get rabbitmq-server # ubuntu, see rabbitmq installation instructions for other platforms
Издатель (отправляет данные):
import pika, time, bson, os
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.exchange_declare(exchange='logs', type='fanout')
i = 0
while True:
data = {'msg': 'Hello %s' % i, b'data': os.urandom(2), 'some': bytes(bytearray(b'\x00\x0F\x98\x24'))}
channel.basic_publish(exchange='logs', routing_key='', body=bson.dumps(data))
print("Sent", data)
i = i + 1
time.sleep(1)
connection.close()
Подписчик (принимает данные, может быть несколько):
import pika, bson
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
channel.exchange_declare(exchange='logs', type='fanout')
result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue
channel.queue_bind(exchange='logs', queue=queue_name)
def callback(ch, method, properties, body):
data = bson.loads(body)
print("Received", data)
channel.basic_consume(callback, queue=queue_name, no_ack=True)
channel.start_consuming()
Примеры, основанные на https://www.rabbitmq.com/tutorials/tutorial-two-python.html
По моему опыту, rpyc
на сегодняшний день является самым простым и изящным способом для этого.
(Я знаю, что это старый вопрос, просто наткнулся на него ..)
Библиотека multiprocessing
предоставляет слушателям и клиентам , которые обертывают сокеты и позволяют передавать произвольные объекты python.
Ваш сервер мог слушать получать объекты python:
from multiprocessing.connection import Listener
address = ('localhost', 6000) # family is deduced to be 'AF_INET'
listener = Listener(address, authkey='secret password')
conn = listener.accept()
print 'connection accepted from', listener.last_accepted
while True:
msg = conn.recv()
# do something with msg
if msg == 'close':
conn.close()
break
listener.close()
Ваш клиент может отправлять команды как объекты:
from multiprocessing.connection import Client
address = ('localhost', 6000)
conn = Client(address, authkey='secret password')
conn.send('close')
# can also send arbitrary objects:
# conn.send(['a', 2.5, None, int, sum])
conn.close()