Могу ли я заставить Perl ithreads работать в Windows одновременно? - PullRequest
2 голосов
/ 17 сентября 2008

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

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

Ответы [ 3 ]

4 голосов
/ 17 сентября 2008

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

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

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

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

2 голосов
/ 17 сентября 2008

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

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

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

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

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

1 голос
/ 18 сентября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...