Уведомления

Группа в Telegram: @pythonsu

#1 Июль 28, 2017 03:14:41

Mr.Anderson
Зарегистрирован: 2015-02-06
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

Зависают процесс multiprocessing

Есть такой код.
main.py

 class PrWorker(multiprocessing.Process):
    def __init__(self, queue_in, queue_out):
        super(PrWorker, self).__init__()
        self.__queue_in = queue_in
        self.__queue_out = queue_out
    def run(self):
        while True:
            task = self.__queue_in.get()
            payl = Main4()
            result = payl.mainStart()
            try:
                for i in result:
                    if i is not 'Error':
                        self.__queue_out.put(i)
                        self.__queue_in.task_done()
                    else:
                        self.__queue_out.put('Error')
                        self.__queue_in.task_done()
            except Exception:
                self.__queue_out.put('Error')
                self.__queue_in.task_done()
if __name__ =='__main__':
    allProc = []
    q = queue.Queue()
    result = queue.Queue()
    for i in range(2):
        q.put(i)
    for i in range(1):
        print(i)
        rp = PrWorker(q, result)
        rp.start()
        allProc.append(rp)
    for p in allProc:
        p.join()
    out = []
    while not result.empty():
        out.append(result.get())
    print('Final')
    print(out)

child4.py
 import queue
import requests
import threading
class Worker(threading.Thread):
    def __init__(self, queue_in, queue_out):
        super(Worker, self).__init__()
        self.setDaemon(True)
        self.__queue_in = queue_in
        self.__queue_out = queue_out
    def run(self):
        """
        Основной код здесь.
        """
        while True:
            # Получаем задание из входящей очереди
            url = self.__queue_in.get()
            try:
                res = requests.get(url, timeout=1).status_code
                print(url + ' : ' + str(res))
                if 'http://google.com' in url:
                    self.__queue_out.put({'url': url,
                                          'status_code': res})
                    self.__queue_in.task_done()
                else:
                    self.__queue_in.task_done()
            except Exception:
                self.__queue_out.put('Error')
                self.__queue_in.task_done()
class Main4(object):
    def buildSitesList(self):
        f = open('sites.txt', 'r').readlines()
        sites = []
        for s in f:
            sites.append(s.rstrip())
        return list(set(sites))
    def mainStart(self):
        q = queue.Queue()
        # Создаем результирующую приоритетную очередь
        result = queue.Queue()
        # Заполняем входящую очередь данными
        for i in self.buildSitesList():
            q.put(i)
        # Создаем и запускаем потоки
        for i in range(20):
            w = Worker(q, result)
            w.start()
        # Блокируем дальенейшее выполнение программы до тех пор пока потоки не обслужат все эелементы очереди
        q.join()
        # Формируем список как результат обработки изначального списка
        out = []
        while not result.empty():
            out.append(result.get())
        print(out)

После отработки очереди программа зависает в подвешенном состоянии. Где я не вижу ошибки?

Отредактировано Mr.Anderson (Июль 28, 2017 03:32:13)

Офлайн

#2 Авг. 1, 2017 12:14:35

Master_Sergius
Зарегистрирован: 2013-09-12
Сообщения: 271
Репутация: +  7  -
Профиль   Отправить e-mail  

Зависают процесс multiprocessing

Добавьте логирование во все циклы “while”, скорее всего проблема именно там.



———————————————————————————
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Офлайн

#3 Авг. 1, 2017 17:42:11

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

Зависают процесс multiprocessing

Mr.Anderson
полагаю, что когда в тред-воркере делается

 url = self.__queue_in.get()
то тред просто виснет в ожидании

попробуй
 try: 
    url = self.__queue_in.get(timeout=1)
except Empty:
    # какой нибудь финалазер
    return

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version