<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def handle_connection(conn, handler, mutex):
 """ Handle a single connection using the specified protocol handler in a loop. Since this function may be called concurrently from server_thread, the specified mutex is used to synchronize the device handling. Exit when EOFError is raised. All other exceptions are logged as warnings. """

    try:
        log.debug('welcome agent')
        with contextlib.closing(conn):
            while True:
                msg = util.read_frame(conn)
                with mutex:
                    reply = handler.handle(msg=msg)
                util.send(conn, reply)
    except EOFError:
        log.debug('goodbye agent')
    except Exception as e:  # pylint: disable=broad-except
        log.warning('error: %s', e, exc_info=True)