Функция вызова другого экземпляра класса [duplicate]

Если мы рассмотрим общие сценарии, в которых может быть выбрано это исключение, доступ к свойствам с объектом вверху.

Пример:

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
34
задан wim 3 August 2011 в 02:57
поделиться

6 ответов

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')
32
ответ дан zeekay 3 September 2018 в 15:39
поделиться

Я бы использовал сокеты; локальная связь была сильно оптимизирована, поэтому у вас не должно быть проблем с производительностью, и это дает вам возможность распространять ваше приложение на разные физические узлы, если это необходимо.

Что касается «низкого уровня», подход, ты прав. Но вы всегда можете использовать обертку более высокого уровня в зависимости от ваших потребностей. XMLRPC может быть хорошим кандидатом, но это может быть чрезмерным для задачи, которую вы пытаетесь выполнить.

Twisted предлагает несколько хороших простых простейших протоколов , например LineReceiver (для простых сообщений на основе строки) или более элегантный AMP (который, кстати, стандартизирован и реализован на разных языках ).

3
ответ дан GaretJax 3 September 2018 в 15:39
поделиться

Я бы использовал сокеты, но использовал Twisted, чтобы дать вам некоторую абстракцию и сделать все просто. Их простой пример Echo Client / Server - хорошее место для начала.

Вам просто нужно объединить файлы и создать экземпляр и запустить клиент или сервер в зависимости от переданного аргумента (с). [/ д2]

1
ответ дан jozzas 3 September 2018 в 15:39
поделиться

Проверьте кросс-платформенную библиотеку / сервер под названием 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

1
ответ дан Mika Vatanen 3 September 2018 в 15:39
поделиться

По моему опыту, rpyc на сегодняшний день является самым простым и изящным способом для этого.

(Я знаю, что это старый вопрос, просто наткнулся на него ..)

7
ответ дан shx2 3 September 2018 в 15:39
поделиться

Библиотека 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()
68
ответ дан vsekhar 3 September 2018 в 15:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: