avoid blocking functions in coroutine