Нет проблем с вашим кодом. Это на самом деле правильное поведение. До того как поток получателя получил первое сообщение, вы фактически изменили словарь. Вот почему вы дважды получаете пустой словарь в ветке получателя. Я просто смоделировал задержку (2 секунды) перед изменением словаря. Теперь вы можете видеть поток получателя, получающий оба состояния.
import threading
from queue import Queue
import time
import copy
q = Queue()
def put(q):
d = {}
d[1] = 2
print('send d = {}'.format(d))
q.put(d)
# d = copy.deepcopy(d) # uncomment this line to fix the problem
#Add a 2 sec delay to allow other thread to receive.
time.sleep(2)
d.pop(1)
print(' send again d = {}'.format(d))
q.put(d)
def get(q):
d = q.get()
print(' received d = {}'.format(d))
d = q.get()
print(' received again d = {}'.format(d))
if __name__ == "__main__":
t1 = threading.Thread(target=put, args=(q,))
t2 = threading.Thread(target=get, args=(q,))
t1.start()
t2.start()
t1.join()
t2.join()
print("Done!")
здесь вывод
отправить d = {1: 2}
получено d = {1: 2}
отправить еще раз d = {}
Получено снова d = {}
Готово!
в контексте обмена сообщениями, 2 сообщения обычно ссылаются на 2 различных объекта, которые вы можете достичь с помощью deepcopy or dict(d)
.
Надеюсь, это поможет.