簡體   English   中英

線程占用大量CPU

[英]Threading taking up large amounts of CPU

我正在使用Thread幫助在perl中執行線程; 我想說我對線程技術還很陌生。

我的程序中有一個名為“最大線程數”的變量。 如果線程數低於此數目,它將提示一個新線程。 我正在使用while循環將現有線程的當前數量與最大線程變量進行比較。

我假設while循環是消耗我的CPU的事情。

無論如何,在安排和管理線程時,我是否可以擁有“老板”或“經理”線程(核心線程)占用的CPU不那么多? 如果我的CPU只是由於管理器線程而上升,那么根本就沒有線程可言!

如果要保留當前模型,則應該有某種信號(可能是信號量),當有太多工作程序時,線程啟動器可以在該信號上阻止該信號。

一個更簡單的模型是擁有一組工作程序,並通過Thread :: Queue給他們工作。

my $q = Thread::Queue->new();

my @workers;
for (1..$MAX_WORKERS) {
    push @workers, async {
       while (my $job = $q->dequeue()) {
           ...
       }
    };
}

for (...) {
    $q->enqueue(...);
}

# Time to exit
$q->enqueue(undef) for 0..$#workers;

# Wait for workers to finish.
$_->join() for @workers;

我不使用Perl,但是從一般的異步編程角度來講,您想要一個不會阻塞主線程的線程池管理器,並且可以通過多種方式來實現。 一方面,您可以將一個線程(是的!)專用於執行以下操作(偽代碼):

while program not terminating:
   wait a quarter-second or so, then
      do your "are-there-enough-threads" check

操作系統或抽象的運行時庫通常會提供某種等待函數,該函數將線程暫停直到經過特定時間(因此在此期間不占用任何調度程序資源)。

另外,如果您的程序是事件驅動的(例如在GUI環境中),則可以通過發布自己的計時器消息來在主線程外進行類似的池管理,這是操作系統通常提供的另一項服務。

與其他語言相比,Perl線程的工作量很大。 他們需要大量資源才能啟動; 嘗試先啟動所有需要的線程,然后保持它們運行。 每當您有一個異步任務要執行時,啟動新線程將效率很低。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM