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")