문제

Perl 스레드(스레드 사용)를 사용하여 설정하려고 하는 Perl 스크립트가 있습니다.간단한 테스트를 실행하면 모든 것이 작동하지만 실제 스크립트(여러 SQL을 실행하는 스레드가 있음)를 수행하면플러스 세션), 각 SQLPlus 세션은 순서대로 실행됩니다(예: 스레드 1의 sqlplus가 1-5단계를 실행한 다음 스레드 2의 sqlplus가 6-11단계를 실행하는 등).

나는 스레드가 동시 처리를 수행한다는 것을 이해했다고 생각했지만 뭔가 잘못되었습니다.어떤 아이디어가 있습니까? 아니면 다른 Perl 마법을 수행해야 합니까?

도움이 되었습니까?

해결책

몇 가지 가능한 설명:

  1. 이 스크립트를 다중 코어 프로세서 또는 다중 프로세서 시스템에서 실행하고 있습니까?CPU가 하나만 있으면 언제든지 하나의 스레드만 사용할 수 있습니다.

  2. 동시에 수행되는 것을 방지하는 1~6단계와 관련된 트랜잭션이나 잠금이 있습니까?

  3. 데이터베이스에 대한 여러 연결을 사용하고 있으며 스레드 간에 단일 연결을 공유하지 않고 있습니까?

다른 팁

실제로 스레드가 실행되는 순서를 보장할 방법이 없습니다.따라서 해당 동작(기대한 것과 다르더라도)은 실제로 잘못된 것은 아닙니다.

여기서 어떤 종류의 동기화가 진행되고 있는 것 같습니다.아마도 SQL*Plus 자체를 한 번만 호출해 볼까요?일부 프로그램에서는 그런 일이 발생합니다.

기타 가능성:

  • 스레드 생성 및 프로세스 생성(당신은 ~이다 SQL*Plus에 대한 하위 프로세스를 생성하는 것은 스레드를 실행하는 것보다 오래 걸리므로 스레드 2가 시작되기도 전에 스레드 1이 완료됩니다.

  • 데이터베이스 업데이트를 강제로 동기화하는 SQL 스크립트의 트랜잭션을 사용하고 있습니다.

데이터베이스 설정을 확인하세요.보수적으로 구성되어 있음을 알 수 있습니다.이로 인해 사소한 읽기라도 해당 정보에 대한 모든 액세스가 차단됩니다.

전화해야 할 수도 있습니다. threads::yield.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top