Найти - Пользователи
Полная версия: многопоточность
Начало » Python для новичков » многопоточность
1
ivanzzz
Есть файл со строками вида:
xx.yy ab - zz.uu cd
это не столь важно, так вот генерация списка всех записей из фала в 600 строк может занять ~3 мин., а 600 строк это самая малость. У вот я подумал как реализовать многопоточность. Я сделал так:

with open(ids,'r') as file:
        id = module_id.ID()
        for line in file:
            id_set = id.get_ip_set(line)
            for i in xrange(THREAD):
                TH = threading.Thread(target=thread_body,args=(id_set,))
                TH.daemon = True
                owners.append(TH)
                TH.start()
            for TH in owners:
                TH.join()
def thread_body(id_set):
    while len(id_set):
        print id_set.pop()
    pass
считываю из файла по одной строке генерирую ее и передаю множество в руки потокам. Проблема в том, что когда потоки обработают множество и количество записей в множестве станет меньше чем потоков то они начнут простаивать. Как сделать чтобы в тот момент когда записи начинают кончатся начали генерироваться следующие?
Хотел по завершению цикла, но так можно потерять потоки если не успеют добавиться новые записи, да и метод может быть вызван не 1 раз.
    while len(id_set):
        print id_set.pop()
    else:
         generate()
Как быть?
doza_and
ivanzzz
Есть файл со строками вида:xx.yy ab - zz.uu cdэто не столь важно, так вот генерация списка всех записей из фала в 600 строк может занять ~3 мин., а 600 строк это самая малость. У вот я подумал как реализовать многопоточность. Я сделал так:
ivanzzz
Как быть?
Разобраться что за генерация которая 3 минуты занимает. По вашему сообщению можно подумать что это чтение из файла столько времени занимает.

А так смотрите https://docs.python.org/2/library/queue.html
ivanzzz
Ну с той генерацией автору предстоит разобраться, а мне нужно чтобы id_set при приближению к концу пополнялось)
doza_and
ivanzzz
а мне нужно чтобы id_set при приближению к концу пополнялось)
:)
Мне кажется вам нужно привести реальный код. Так как у вас написано в тредах только len и pop выполняются. По причине наличия в питоне gil разбиение на треды код только замедлит. И все ваши потуги выглядят как мартышкин труд.

Балансирование нагрузки на выполняется очередями, ссылку я вам уже дал.
ivanzzz
doza_and
Мне кажется вам нужно привести реальный код
Это метод имитации полезной работы. )
py.user.next
ivanzzz
У вот я подумал как реализовать многопоточность.
Скорее всего, ты просто что-то неправильно сделал.

ivanzzz
600 строк это самая малость
Многопоточность имеет смысл, когда там десятки тысяч строк.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB