Reputation: 735
Ive checked this all sorts of ways, not sure why my various processes wont start and run at the same time there is no error to google as it does work for the most part
from multiprocessing import Process, Queue, Event #for threading
class WebScraper(object):
def __init__(self, pq, e):
self.pdfQueue = pq
self.e = e
def run(self):
i = 0
while True:
print('tweet scraper online')
i = i + 1 #testing
if i == 10: #testing
e.set() #testing TODO remove
if self.e.is_set():
print("killing tweet scraper")
break
class DataParser(object):
def __init__(self, pq, dq, e):
self.pdfQueue = pq
self.dataQueue = dq
self.e = e
self.count = 0
def run(self):
while True:
pdf = self.pdfQueue.get()
print ('parsing pdf')
self.e.set()
if self.e.is_set():
print ('killing database parser')
break
class DatabaseWriter(object):
def __init__(self, dq, e):
self.dataQueue = dq
self.e = e
def run(self):
while True:
print("database writer")
if self.e.is_set():
print ('killing database writer')
break
if __name__ == '__main__':
print('\nStarting script')
e = Event()
pq = Queue()
dq = Queue()
ws = WebScraper(pq, e)
dp = DataParser(pq, dq, e)
dw = DatabaseWriter(dq, e)
p1 = Process(target=ws.run)
p1.start()
p2 = Process(target=dp.run)
p2.start()
p3 = Process(target=dw.run)
p3.start()
p1.join()
p2.join()
p3.join()
The output is as follows it runs quickly with nothing unexpected as you can see both processes
Starting script
tweet scraper online
tweet scraper online
tweet scraper online
tweet scraper online
tweet scraper online
tweet scraper online
tweet scraper online
tweet scraper online
tweet scraper online
tweet scraper online
killing tweet scraper
database writer
killing database writer
If I remove the if statement in WebScraper class WebScraper and DatabaseWriter start but DatabaseParser does not look to be running
Upvotes: 1
Views: 125
Reputation: 116
Your self.pdfQueue.get() is blocking the rest of the method in your DataParser instance. See https://docs.python.org/2/library/queue.html#Queue.Queue.get
Upvotes: 1