LINUX.ORG.RU

Не прибиваются треды

 , , treads


0

1

Помогите разобраться. Пробую писать многопоточно в монгу, данные пишутся, а вот потоки не освобождаются :(

def writer(ip,data):

        conn = pymongo.Connection('localhost', 27017)

        db = conn['mydb']

        coll = db[ip]

        write_data =    {data['timestamp']: data['count']}

        coll.insert(write_data)
        
        if args.verbose:
                print write_data

def create_data(ip,lock):

        dump = get_dump(ip)

        writer(ip,parse_dump( dump))

        lock.release()

def main():
        if args.ip is not None:
                create_data(args.ip, None)
        else:
                ip_list = open(ip_file,"r").readlines()

                lock_list = []
                for ip in ip_list:
                        # Создаем новый объект блокировки. Изначально блокировка в состоянии False.
                        lock = thread.allocate_lock()
                        # Блокируем объект
                        lock.acquire()
                        # Запоминаем блокировку
                        lock_list.append(lock)
                        # Запускаем новый поток и выполняем в нем функцию
                        thread.start_new_thread(create_data, (ip, lock))

                # Ожидаем завершения всех потоков
                while(any([l.locked() for l in lock_list])):
                        print len(lock_list)
                        time.sleep(2)

main()

После исполнения записи, len(lock_list) не меняется, почему не отрабатывает lock.release() ? Пробовал его закомментировать, ситуация не изменилась, как-будто я его не в том месте вызываю.

★★★★★

len(lock_list) не меняется

Не вижу, почему она должна меняться.

почему не отрабатывает lock.release() ?

А управление вообще доходит до него?

P.S. используешь thread, захватываешь лок в одной нити, освобождаешь в другой... это неправильно. Используй threading, набросай себе класс «очередь», и работай через нее.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

спасибо, надо будет переделать под threading. За пример брал http://pkolt.ru/pages/233/ , но там цикл оказывается тоже не прекращается, надо было сразу проверить. возможно у автора была другая версия питона.

autonomous ★★★★★
() автор топика
Ответ на: комментарий от autonomous

За пример брал http://pkolt.ru/pages/233/

while(any([l.locked() for l in lock_list])):
    time.sleep(2)

Ну и говно. А что, в питоне нет джоинов?

У меня в плюсовом проекте от предыдущего автора осталась такая же херня. Сукаубилбы!

anonymous
()
Ответ на: комментарий от anonymous

джионы есть, но видимо автор их не осилил, поэтому теперь их осиливаю я :)

autonomous ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.