Могу ли я заставить Perl ithreads в Windows запускаться одновременно?

StackOverflow https://stackoverflow.com/questions/86220

Вопрос

У меня есть Perl-скрипт, который я пытаюсь настроить с помощью Perl Threads (использовать потоки).Когда я запускаю простые тесты, все работает, но когда я выполняю свой реальный скрипт (в котором потоки запускают несколько SQLПлюс сеансы), каждый SQLСеанс Plus выполняется по порядку (т. е. sqlplus потока 1 выполняет шаги 1-5, затем sqlplus потока 2 выполняет шаги 6-11 и т.д.).

Я думал, что понял, что потоки будут выполнять параллельную обработку, но что-то не так.Есть идеи, или мне следует использовать какую-то другую магию Perl?

Это было полезно?

Решение

Несколько возможных объяснений:

  1. Вы запускаете этот скрипт на многоядерном процессоре или многопроцессорной машине?Если у вас только один процессор, только один поток может использовать его в любое время.

  2. Существуют ли транзакции или блокировки, связанные с шагами 1-6, которые не позволили бы выполнять это одновременно?

  3. Вы уверены, что используете несколько подключений к базе данных и не используете ни одного из них совместно между потоками?

Другие советы

На самом деле, у вас нет способа гарантировать, в каком порядке будут выполняться потоки.Таким образом, поведение (если не то, что вы ожидаете) на самом деле не является неправильным.

Я подозреваю, что у вас здесь происходит какая-то синхронизация.Возможно, SQL * Plus будет вызван только один раз?Некоторые программы делают это...

Другие возможности:

  • создание потоков и процессов (вы являются создание подпроцессов для SQL * Plus, не так ли?) занимает больше времени, чем запуск потока, поэтому поток 1 завершается еще до запуска потока 2

  • Вы используете транзакции в своих SQL-скриптах, которые принудительно синхронизируют обновления базы данных.

Проверьте настройки вашей базы данных.Вы можете обнаружить, что он настроен консервативно.Это привело бы к тому, что даже незначительные операции чтения заблокировали бы весь доступ к этой информации.

Возможно, вам также потребуется позвонить threads::yield.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top