Найти - Пользователи
Полная версия: Не понял многопоточность (threading)
Начало » Python для новичков » Не понял многопоточность (threading)
1 2 3
Pironity
Привет всем.
Имеются:
 def first(num):
    if num % 2 == 0:
        return True
    return False
def second(num):
    if num * 3 <= 100000:
        return True
    return False
def main():
    listNums = [i for i in range(1,100000)]
    for nums in listNums:
        if first(nums) and second(nums):
            print(nums)
if __name__ == "__main__":
    main()
и
 from threading import Thread
def first(num):
    if num % 2 == 0:
        return True
    return False
def second(num):
    if num * 3 <= 100000:
        return True
    return False
def main():
    listNums = [i for i in range(1,100000)]
    for nums in listNums:
        t1 = Thread(target=first, args=(nums,))
        t2 = Thread(target=second, args=(nums,))
        t1.start()
        t2.start()
        if first(nums) and second(nums):
            print(nums)
if __name__ == "__main__":
    main()
При этом
time python no-threading
real 0m0.062s
user 0m0.035s
sys 0m0.023s
и
time python threading
real 0m6.383s
user 0m5.420s
sys 0m3.077s
Я не правильно понял, что такое многопоточность (ожидал использования 1+ потока процессора и, как следствие, ускорения выполнения задач), или я неверно написал код?
JOHN_16
Почитайте что такое в питоне GIL и тогда все прояснится почему вы не достигли желаемого (код правильный).
Но если вы по прежнему хотите распараллелить это - то используйте multiprocessing - там интерфейс вызовов (насколько помню) схожий - минимум кода поменять.
Pironity
JOHN_16
за подсказку про GIL спасибо. Не знал, что все так плохо…
По поводу мультипроцессинга, изменил код на:
 from multiprocessing import Process
def first(num):
    if num % 2 == 0:
        return True
    return False
def second(num):
    if num * 3 <= 100000:
        return True
    return False
def main():
    listNums = [i for i in range(1,100000)]
    for nums in listNums:
        t1 = Process(target=first, args=(nums,))
        t2 = Process(target=second, args=(nums,))
        if first(nums) and second(nums):
            print(nums)
if __name__ == "__main__":
    main()
В итоге:
real	0m0.687s
user 0m0.641s
sys 0m0.044s
Лучше, конечно, но все равно медленнее. Может быть я не с той стороны подхожу к проблеме? Если мне нужно ускорение выполнения кода при работе с большими объемами данных, возможно есть другие модули и библиотеки? Единственное, я пробовал pypy, но он оказался медленнее чем python.
FishHook
Pironity
Может быть я не с той стороны подхожу к проблеме? Если мне нужно ускорение выполнения кода при работе с большими объемами данных,
Вероятно. А как вы себе вообще представляете увеличение производительности распараллеливанием задач? Ну правда, процессор то один, и поэтому только один поток кода может выполняться в единицу времени.
vic57
1. попробуй без print
2. numpy, scipy
Pironity

FishHook
А как вы себе вообще представляете увеличение производительности распараллеливанием задач?
Весьма отдаленно. Для меня выглядит так. У моего цпу 8 потоков. При выполнении кода задействован всего 1 на 100%. Если создать правильно распределение и задействовать больше 1 потока, в т.ч. все 8, скорость выполнения вырастет. Не в 8 раз, конечно, но ощутимо. Иначе какой смысл от многопоточных процессоров. Я не прав?
Pironity
vic57
попробуй без print
Это всего лишь пример, чтобы мои портянки не выкладывать. В реальных задачах в основном заполняются файлы или таблицы. Но там та же тенденция.
vic57
numpy, scipy
Не совсем понял, как эти расширения помогут. Судя по описанию, они добавляют многомерные массивы и сложные мат.вычисления с этими массивами. У меня такого и в помине нет.
FishHook
Pironity
У моего цпу 8 потоков.
у вашего ЦПУ вообще нет никаких потоков
FishHook
Pironity
Я не прав?
Вы категоричесмки не правы.
Что делать? Читатиь литературу. Таненбаум для начала пойдет.
Pironity
FishHook
у вашего ЦПУ вообще нет никаких потоков

https://habrahabr.ru/company/intel/blog/243385/
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