Как хранить много словарей и получить к ним доступ - PullRequest
0 голосов
/ 24 марта 2019

У меня есть сокетное соединение, скажем, клиент и сервер. Поэтому я отправляю данные с клиента на сервер и на стороне сервера, сохраняю их как словарь в виде пары ключ-значение. Но я не уверен, как складывать. Например: я отправляю сообщение «animal» и сохраняю его как my_dict = {a: b}, где a - это сообщение, а b - связанный с ним ip-адрес. Так что я хочу, если я отправлю сообщение как «человек». Я хочу сохранить сообщение и IP-адрес. но когда я печатаю my_dict, он всегда выдает последнее сообщение, которое я отправил. Я действительно хочу напечатать весь набор словарей, которые были сохранены. я хочу напечатать «животное»: ip и «человек»: ip.

Я хочу получить доступ к этому словарю, например, принимая животное в качестве темы и ip в качестве связующего IP-адреса для связи. (Pub-суб)

сторона сервера:

    def bd_recv(host,port):
        my_dict=dict()
        #listening bd for other devices and controllers
        sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
        address=host,port
        sock.bind(address)
        msg,client=sock.recvfrom(4089)
        a=msg.decode()
        b=client[0]
        my_dict={a:b}

        for key,value in my_dict.items():
            print (key)
    def pub-sub():
       context = zmq.Context()
       sub=context.socket(zmq.SUB)  # Note.
       #for the animal topic here i will refer to dictionary. if this animal topic is there i will take that key and value(ip) and append that to the variable ip here.
       sub.setsockopt_string(zmq.SUBSCRIBE, 'animal:')  # Note.
       ip=# here comes the value for animal which is ip.
       sub.connect('tcp://ip:8000')
       for i in range(2):
       print('Received: %s' % sub.recv())

    if __name__=="__main__":
        t1 = threading.Thread(target=bd_recv, name='broadcast_receive', args=(bd_of_the_machine, 9289))
        threads=threading.Thread(target=pub-sub)
        t1.start()
        threads.start()

Ответы [ 2 ]

0 голосов
/ 24 марта 2019

На стороне сервера вы должны сделать диктат в области действия, выходящей за пределы bd_recv, и, например, в bd_recv вы должны вернуть диктат {a: b}, который вы должны добавить к этому диктову

Обновление:

import socket
import threading
import time

total_dict = {}

def bd_recv(host, port):
    global total_dict
    while True:
        my_dict=dict()
        #listening bd for other devices and controllers
        sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
        address=host,port
        sock.bind(address)
        msg,client = sock.recvfrom(4089)
        a = msg.decode()
        b = client[0]
        my_dict = {a:b}
        total_dict.update({a:b})

        for key,value in my_dict.items():
            print (key)

def print_all_animals():
    while True:
        print(total_dict)
        time.sleep(1)

if __name__=="__main__":
    t1 = threading.Thread(
        target=bd_recv,
        name='broadcast_receive',
        args=("0.0.0.0", 9289)
    )
    t2 = threading.Thread(
        target=print_all_animals,
        name="print_all_animals",
        # args=()
    )
    t1.start()
    t2.start()

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

0 голосов
/ 24 марта 2019

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

my_dict[a] = b

Также ваш словарь должен быть объявлен вне тела функции:

my_dict = {}

def bd_recv(host,port):        
    #listening bd for other devices and controllers
    sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    address=host,port
    sock.bind(address)
    msg,client=sock.recvfrom(4089)
    a=msg.decode()
    b=client[0]
    my_dict[a] = b

    for key,value in my_dict.items():
        print (key)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...