die folgende Klasse Gegeben:Kann ich davon ausgehen, dass meine Threads fertig sind, wenn threading.active_count() 1 zurückgibt?
from abc import ABCMeta, abstractmethod
from time import sleep
import threading
from threading import active_count, Thread
class ScraperPool(metaclass=ABCMeta):
Queue = []
ResultList = []
def __init__(self, Queue, MaxNumWorkers=0, ItemsPerWorker=50):
# Initialize attributes
self.MaxNumWorkers = MaxNumWorkers
self.ItemsPerWorker = ItemsPerWorker
self.Queue = Queue # For testing purposes.
def initWorkerPool(self, PrintIDs=True):
for w in range(self.NumWorkers()):
Thread(target=self.worker, args=(w + 1, PrintIDs,)).start()
sleep(1) # Explicitly wait one second for this worker to start.
def run(self):
self.initWorkerPool()
# Wait until all workers (i.e. threads) are done.
while active_count() > 1:
print("Active threads: " + str(active_count()))
sleep(5)
self.HandleResults()
def worker(self, id, printID):
if printID:
print("Starting worker " + str(id) + ".")
while (len(self.Queue) > 0):
self.scraperMethod()
if printID:
print("Worker " + str(id) + " is quiting.")
# Todo Kill is this Thread.
return
def NumWorkers(self):
return 1 # Simplified for testing purposes.
@abstractmethod
def scraperMethod(self):
pass
class TestScraper(ScraperPool):
def scraperMethod(self):
# print("I am scraping.")
# print("Scraping. Threads#: " + str(active_count()))
temp_item = self.Queue[-1]
self.Queue.pop()
self.ResultList.append(temp_item)
def HandleResults(self):
print(self.ResultList)
ScraperPool.register(TestScraper)
scraper = TestScraper(Queue=["Jaap", "Piet"])
scraper.run()
print(threading.active_count())
# print(scraper.ResultList)
Wenn alle Threads fertig sind, gibt es immer noch einen aktiven Thread - threading.active_count()
in der letzten Zeile wird mir diese Nummer. Das aktive Gewinde ist <_MainThread(MainThread, started 12960)>
- wie mit threading.enumerate()
gedruckt.
Kann ich davon ausgehen, dass alle meine Threads fertig sind, wenn active_count() == 1
? Oder importieren importierte Module zum Beispiel zusätzliche Threads, so dass meine Threads tatsächlich fertig sind, wenn active_count() > 1
- auch die Bedingung für die Schleife, die ich in der run-Methode verwende.
Die 'Klasse TestScraper():' Zeile fehlt? – cat
Um die Dinge einfach zu halten, habe ich nur einen Teil des Codes gepostet. Ich habe jetzt einen Pastebin-Link zum vollständigen Skript hinzugefügt. – user2693053
Der Code, den Sie posten, muss minimal, vollständig und überprüfbar sein ([mcve]), und dies scheint Importe und Definitionen zu vermissen. – cat