// Returns whether the client is connected or not.
        // If the client is not connected but is alive (see IsAlive), we assume
        // it is reconnecting and the method will wait (blocking the main thread)
        // for a certain time until the client reconnects.
        internal static bool EnsureConnection()
        {
            if (!IsAlive)
            {
                return(false);
            }

            // The client is alive. Give it some time to reconnect if it
            // is not
            var iter = PythonRunner.WaitForConnection(Constants.clientName, Constants.clientReconnectionTimeout);

            bool moving = true;

            while (moving)
            {
                using (Py.GIL())
                {
                    moving = iter.MoveNext();

                    // Use the Python time module to sleep. This gives the
                    // interpreter a chance to schedule its threads
                    dynamic time = Py.Import("time");
                    time.sleep(Constants.interpreterSleepPeriod);
                }
            }

            if (PythonRunner.IsClientConnected(Constants.clientName))
            {
                return(true);
            }

            // The client never reconnected
            UnityEngine.Debug.LogWarning("The Shotgun client process is not connected. Please reimport the Shotgun package");

            // Client is not connected, update the PID
            PID = -1;
            return(false);
        }