Sure, you can't call destroy from another thread, it may segfault because libuv is modifying something, for instance. I think the proper fix here is to add a _destroyed boolean flag and also raise RuntimeError in case the loop was already destroyed. With your fix calling destroy() twice gives a misleading error description, because you may have called destroy twice from the same thread.