gRPC Android DEADLINE_EXCEEDED, но запрос к серверу не выполнен

Если matplotlib в вашей программе использует бэкенд QT (который, как я полагаю, с тех пор, как вы вставляете его в приложение Qt), тогда рисунок будет выполнен в потоке, который вы вызываете командами matplotlib. Это будет проблемой, потому что Qt требует, чтобы весь рисунок делался из основного потока. Поэтому я уверен, что вы не можете это исправить. (если вы использовали GTK, вы можете использовать блокировку gtk, чтобы основной процесс не взаимодействовал с графическим интерфейсом, в то время как вы делали связанные с GUI вещи из своего потока, но Qt избавился от их аналогичной блокировки в версии 4 и выше).

У вас есть несколько вариантов:

  1. Попробуйте выделить части чертежа matplotlib (возможно, даже не возможно?) и запустите их в основном потоке, отправив события с помощью QApplication.postEvent()
  2. Вместо использования потока просто используйте обратные вызовы в основном потоке (может быть, вызывается периодически с помощью QTimer или когда программа простаивает). Эта проблема не повлияет на производительность вашего приложения, поскольку Python GIL в любом случае предотвращает истинное многопоточное поведение.
  3. Используйте другую библиотеку графиков. Я посмотрел на PyQtGraph на днях, и, похоже, он идет хорошо. Из моего краткого взгляда я думаю, что у него есть способность обрабатывать все это за кулисами для вас, используя RemoteGraphicsView. Это запустило бы второй процесс для интенсивно создаваемого процессора материала, который обойдет вышеупомянутую проблему PILON GIL. Ознакомьтесь с примерами, которые они предоставляют, если вы заинтересованы

0
задан bryant 16 January 2019 в 23:24
поделиться

1 ответ

После небольшого исследования я считаю, что проблема заключалась в том, что прокси на сервере закрывал соединение после нескольких минут простоя, и клиент ManagedChannel не обнаружил это автоматически и снова подключился, когда это произошло. При создании ManagedChannel я добавил к нему idleTimeout, который будет предварительно уничтожать соединение, когда оно бездействует, и восстанавливать его, когда оно понадобится снова, и это, похоже, решает проблему. Таким образом, новая конструкция канала выглядит следующим образом:

@Singleton
@Provides
fun providesMyClient(app: Application): MyClient {
    val channel = AndroidChannelBuilder
            .forAddress("example.com", 443)
            .overrideAuthority("example.com")
            .context(app.applicationContext)
            .idleTimeout(60, TimeUnit.SECONDS)
            .build()
    return MyClient(channel)
}
0
ответ дан bryant 16 January 2019 в 23:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: