I’ve figured out a partial hack for this which works slightly better, but not perfectly. When initializing the DataLoader:
def worker_init(x):
    signal.signal(signal.SIGINT, signal.SIG_IGN)

loader = DataLoader(dataset, batch_size=batch_size, shuffle=shuffle, num_workers=n_workers,
                                  worker_init_fn=worker_init)

Instead of exploding the terminal, I get:
Exception ignored in: <bound method _DataLoaderIter.__del__ of <torch.utils.data.dataloader._DataLoaderIter object at 0x7fcb5c36c358>>
Traceback (most recent call last):
...
TypeError: 'NoneType' object is not callable

So: better, but not perfect.