Я с этой проблемой в Python:Заполнение очереди и управление многопроцессорной в питона
- У меня есть очередь URL-адресов, что мне нужно, чтобы проверить время от времени
- , если очередь заполняется , мне нужно обрабатывать каждый элемент в очереди
- Каждый элемент в очереди должны быть обработаны одним процессом (многопроцессорной)
до сих пор мне удалось достичь этого «вручную», как это:
while 1:
self.updateQueue()
while not self.mainUrlQueue.empty():
domain = self.mainUrlQueue.get()
# if we didn't launched any process yet, we need to do so
if len(self.jobs) < maxprocess:
self.startJob(domain)
#time.sleep(1)
else:
# If we already have process started we need to clear the old process in our pool and start new ones
jobdone = 0
# We circle through each of the process, until we find one free ; only then leave the loop
while jobdone == 0:
for p in self.jobs :
#print "entering loop"
# if the process finished
if not p.is_alive() and jobdone == 0:
#print str(p.pid) + " job dead, starting new one"
self.jobs.remove(p)
self.startJob(domain)
jobdone = 1
Однако это приводит к множеству проблем и ошибок. Я задавался вопросом, не лучше ли я, используя пул процессов. Каким будет правильный способ сделать это?
Однако много раз моя очередь пуста, и она может быть заполнена на 300 единиц за секунду, поэтому я не слишком уверен, как это делать.
это не работает на windows в python 2.7.4, вам нужно иметь if __name__ = '__main__' part, и вы должны передать the_queue в качестве третьего параметра в функцию multiprocessing.Pool, иначе рабочий_main не получит данные – jhexp
. Меня также интересует, как заставить этот кусок кода работать. Когда я запускаю его так, как он есть, он запускается, но ничего не печатает, возможно, потому, что worker_main не получает данные. Но когда я передаю the_queue в качестве третьего параметра, я получил аргумент TypeError: worker_main() после *, должен быть последовательностью, а не Queue – ziky90
@ ziky90 Вероятно, вы забыли кому в '(queue,)'. Я редактировал код, чтобы добавить комментарий, указывающий на возможный источник ошибки. –