次のコードは作業スレッドで実行され、一時停止/レポートコマンドなどを受信して、うまくスピンします。RAMの使用に問題がなく、週末にハードドライブが溶けなかったため、これらはソフトフォールトだと思います。 、そしてそれは、数日前に起動したときに50ページフォールトしか発生していないので、結果を蓄積させた時間と関係があります。
「counter」属性は現在22,496,115であり、「results」には1,418,641個の要素があります。「結果」のスライスは、私が反対を感じていたので、1からリストを開始したために取得されます。
def run(self):
while self.keep_running:
self.lock.acquire()
is_prime = True
self.counter += 1
cutoff_val = pow(self.counter,.5)
for number in self.results[1:]:
if number > cutoff_val:
break
if self.counter % number == 0:
is_prime = False
break
if is_prime:
self.results.append(self.counter)
self.lock.release()
注:エラトステネスのふるいを使用してアルゴリズムを最適化し、おそらくページフォールトを削減できることは知っていますが、それは重要ではありません。正確な理由、または少なくとも最悪の犯罪者を特定しようとしています。ページフォールトなので、将来同じようなことをするのを避けることができます。このアルゴリズムは、「ばかげて高価で単純な作業スレッド」が必要な場合に、UIの応答性をテストするためだけに使用されます。
要求に応じた追加のセットアップピース:
def __init__(self):
self.counter = 0
self.keep_running = False;
self.lock = threading.Lock()
self.results = list()
def __call__(self, *args):
if not self.keep_running:
self.keep_running = True
self.run()