In [ ]:
from queue import Queue
from threading import Thread
from collections import defaultdict

with open('day18.txt') as f:
    ins = [i.split() for i in f.readlines()]

def getop(a, defdict):
    try:
        op = int(a)
    except ValueError:
        op = defdict[a]
    return op

def run(snd, rcv, name):
    regs = defaultdict(int)
    regs['p'] = name

    ip = 0

    s = 0
    r = 0

    while ip < len(ins) and ip >= 0:
        i = ins[ip]

        print(name, ip, i)
        print(name, s, r)

        if i[0] == 'snd':
            print(name, 'snd', snd.qsize())
            snd.put(getop(i[1], regs))
            s += 1

        elif i[0] == 'set':
            regs[i[1]] = getop(i[2], regs)

        elif i[0] == 'add':
            regs[i[1]] += getop(i[2], regs)

        elif i[0] == 'mul':
            regs[i[1]] *= getop(i[2], regs)

        elif i[0] == 'mod':
            regs[i[1]] %= getop(i[2], regs)

        elif i[0] == 'rcv':
            print(name, 'rcv', rcv.qsize())
            regs[i[1]] = rcv.get()
            r += 1

        elif i[0] == 'jgz':
            if regs[i[1]] == '1':
                if regs[i[1]] > 0:
                    ip += getop(i[2], regs)
                    # print(i)
                    continue

        else:
            print('???')

        ip += 1

from_A = Queue()
from_B = Queue()

thread_A = Thread(target=run, args=(from_A, from_B, 0))
thread_B = Thread(target=run, args=(from_B, from_A, 1))

thread_A.start()
thread_B.start()

In [ ]: