[英]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.