Files
conjurer/conjurer_librarian/search_bot.py
T

81 lines
2.4 KiB
Python

from queue import Queue, Empty
from threading import Thread
q = Queue()
MAXTHREADS = 39
#MAXTHREADS = 4
DATABASE_PATH = r'C:\\Database\\chunks_1\\'
ENCODING = "utf-8"
CHUNk = "_chunk.txt"
_sentinel = object()
#TODO: Doisy wchodzą jako lista krotek (doi, False) - po znalezieniu zaznaczamy na True i potem już nie porównujemy
#TODO: lista krotek - jeśli wszystkie mają True dajemy terma
def producer(out_q, control_q, filename):
with open(DATABASE_PATH + filename, "r+", encoding=ENCODING) as operated_file:
lines = operated_file.readlines()
for line in lines:
out_q.put(line)
try:
check = control_q.get(block=False)
except Empty:
check = False
pass
if check is _sentinel:
print("TERM signal received")
control_q.put(check)
break
print("Worker finished")
out_q.put(_sentinel)
#IMPORTANT!!! ONLY ONE CONSUMER THREAD AS WE ARE NOT PUTTING SENTINELS BACK
#TODO: Change doi to tuple list and only put term when all doi are found => (doi, True)
def consumer(in_q, control_q, doi):
sentinels = 0
while True:
data = in_q.get()
if data is _sentinel:
print("Worker finished")
sentinels += 1
elif doi in data:
control_q.put(_sentinel)
print(data)
print("HIT")
if sentinels >= MAXTHREADS:
print("All workers finished")
break
def search_for_doi(doi):
threads = []
work_q = Queue(maxsize=10000000)
control_q = Queue()
t_cons = Thread(target = consumer, args = (work_q, control_q, doi))
threads.append(t_cons)
for i in range(0,MAXTHREADS):
#filename = "test" + str(i) + CHUNk
filename = str(i) + CHUNk
print(filename)
threads.append(Thread(target = producer, args = (work_q, control_q, filename)))
for worker in threads:
worker.start()
for worker in threads:
worker.join()
try:
check = control_q.get(block=False)
control_q.put(check)
return True
except Empty:
return False
if __name__ == "__main__":
if search_for_doi("10.1002/9781118786352.wbieg0998.pub2"):
#if search_for_doi("10.1108/gm-02-2016-0025xx"):
print("found")
exit()
else:
print("Not found")