Учитывая следующий класс:Могу ли я предположить, что мои потоки выполняются, когда threading.active_count() возвращает 1?
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)
Когда все нити сделаны, есть еще один активный поток - threading.active_count()
на последней строке получает меня этот номер.
Активная нить <_MainThread(MainThread, started 12960)>
- как напечатана с threading.enumerate()
.
Могу ли я предположить, что все мои темы выполняются, когда active_count() == 1
? Или, например, импортированные модули запускают дополнительные потоки, так что мои потоки фактически выполняются, когда active_count() > 1
- также условие для цикла, который я использую в методе run.
'class TestScraper():' отсутствует? – cat
Чтобы все было просто, я отправил часть кода. Теперь я добавил ссылку pastebin на полный скрипт. – user2693053
Код, который вы публикуете, должен быть минимальным, полным и поддающимся проверке ([mcve]), и это, похоже, пропустят импорт и определения – cat