Size: a a a

Сообщество Python Программистов

2020 February 28

A

Alexander in Сообщество Python Программистов
как я понял - ты хочешь ускорить вычисление ряда чисел фибоначчи 4-мя параллельными вычислениями
источник

F

FWorld.deb in Сообщество Python Программистов
да
источник

A

Alexander in Сообщество Python Программистов
но особо не продумал алгоритм распределения задачи
источник

F

FWorld.deb in Сообщество Python Программистов
Alexander
fib_list не доступен из треда
В смысле массив из треда недоступен?
источник

A

Alexander in Сообщество Python Программистов
FWorld.deb
В смысле массив из треда недоступен?
он глобален в рамках топлевела, из треда можно читать глобалы
источник

A

Alexander in Сообщество Python Программистов
но не изменять их
источник

A

Alexander in Сообщество Python Программистов
это потоконебезопасно
источник

b

bbclub in Сообщество Python Программистов
Alexander
смотри filter
+
источник

b

bbclub in Сообщество Python Программистов
Language:
python3


Source:
a='fffgh 15'
b = filter(lambda x: x.isdigit(), a)
print(*b)


Result:
1 5
источник

A

Alexander in Сообщество Python Программистов
FWorld.deb
В смысле массив из треда недоступен?
лучше решать эту задачу немного иначе, чтобы получить действительный прирост производительности
Рассмотрим интересное свойство: "Натуральное число N является числом Фибоначчи тогда и только тогда, когда 5N**2+4 является квадратом, или math.sqrt(5N**2+4)%10 == 0
тогда имеет смысл запустить в 4-х тредах поиск старта таких чисел от каждых 10000 например, затем, получив результаты выполнения всех тредов - запустить треды с поиском чисел фибоначчи от найденного числа до следующего найденного числа + 1 тред от 1 до минмиального найденного числа. Получится некий ряд чисел фибоначчи в диапазоне от 1 до 50000, выисленный, по сути в ~3.8 раза быстрее, ем последовательный перебор
источник

A

Alexander in Сообщество Python Программистов
источник

A

Alexander in Сообщество Python Программистов
оттуда есть ссылка на распределенные вычисления. Это тоже маст рид
источник

A

Alexander in Сообщество Python Программистов
FWorld.deb
import _thread as thread

num = int(input())
fib_list = [1, 1]
fib1 = fib2 = 1
check_stop_thread = [False] * 4

if num < 2:
   print('Значение должно быть больше 2х')


def make_fib_list(num1, num2, n):
 for i in range(num1, num2):
     fib1, fib2 = fib2, fib1 + fib2
     fib_list.append(fib2)
 check_stop_thread[n] = True


thread.start_new_thread(make_fib_list, (2, num // 4, 0,))
thread.start_new_thread(make_fib_list, (num // 4, num // 4 + num // 2, 1,))
thread.start_new_thread(make_fib_list, (num // 4 + num // 2, num // 2, 2,))
thread.start_new_thread(make_fib_list, (num // 2, num, 3,))

while False in check_stop_thread:
 pass
else:
 print(fib_list)
а ключевая ошибка именно твоего кода в том, что на этапе запуска тредов им всем доступен массив fib_list содержащий только два значения. Внутри треда выполняется функция append(), которая добавляет новый элемент в массив с индексом 2... параллельно... в 4 потока. Т.е. если отложить системную защиту, и на секунду представить, что все бы заработало - то без GIL ты бы получил перетирание элементов массива, поскольку его измененное состояние недоступно из остальных тредов. Это явный пример Race Condition. Тогда нужно блокировать массив от записи для остальных тредов, пока туда не запишет один тред - этим занимается GIL. Так было бы в том случае, если вместо глобального массива ты бы использовал запись в файл например. Но поверь, на выходе получится нечленораздельная херня
источник

A

Alexander in Сообщество Python Программистов
При том, что учитывая блокировки GIL 4-х кратного прироста производиельности ты не достигнешь
источник

A

Alexander in Сообщество Python Программистов
а вот использовать результаты выполнения потоков, если заранее заданы области для работы этих потоков - это вполне адекватная задача для многопоточного приложения
источник

A

Alexander in Сообщество Python Программистов
Надеюсь, объяснил понятно)
источник

A

Alexander in Сообщество Python Программистов
Но, за стремление к пониманию многопоточности отдельный плюсик
источник

A

Alexander in Сообщество Python Программистов
в самом начале своего пути я делал то же самое примерно так же)
источник

A

Alexander in Сообщество Python Программистов
и так же не понимал, почему не работает
источник

A

Alexander in Сообщество Python Программистов
вот только спросить можно было только у книжки
источник