У меня есть две простые функции Python с time.sleep и чтением данных, поэтому я привязан к вводу-выводу, но я не получаюPython

Программы на Python
Ответить
Anonymous
 У меня есть две простые функции Python с time.sleep и чтением данных, поэтому я привязан к вводу-выводу, но я не получаю

Сообщение Anonymous »

Ранее у меня был вопрос о примере многопроцессорной обработки, который вы можете увидеть по следующей ссылке.
Я использовал пул из двух рабочих, чтобы разделить сумму в функции с многопроцессорной обработкой Python, но время не ускоряется, есть ли что-то, что мне не хватает?
Ответ заключался в том, что сбор данных для отправки процессорам и их распаковка стоят слишком дорого, чтобы свести на нет преимущества использования многопроцессорности. И действительно, использование простого цикла суммирования или проверки простоты, предложенное @MathiasR.Jessen, было бы лучшим примером, который не включал бы эти действия травления.
Теперь для модулей threading и asyncio у меня есть примеры с использованием time.sleep, которые работают как положено. Тем не менее, я подумал о том, чтобы подобрать что-нибудь очень простое в качестве примера ввода-вывода, а не просто команды сна + печати. Один из примеров, о котором я думал, заключался в том, чтобы составить большой список чисел и поставить перед собой две задачи: прочитать этот длинный список, а также позаботиться о сне. Например, список целых чисел от 10**7 до 10**8. Если предположить, что чтение всех его записей с помощью простого цикла for занимает 1 секунду, то задача, которая читает этот список, приостанавливает 5 секунд, а затем снова читает его, должна занять около 6 секунд. Вторая задача, только чтение этого списка, должна занять всего 1 секунду. Таким образом, выполнение этих двух задач в последовательном порядке займет около 7 секунд.

Код: Выделить всё

import time

big_data = [ i for i in range( 10 ** 7, 10 ** 8 ) ]

def task1():
for data in big_data:
data
time.sleep( 5 )
for data in big_data:
data

def task2():
for data in big_data:
data

st = time.time()
task1()
task2()
et = time.time()

print( f"It took { et - st } seconds to do the two tasks." )
Если я определяю два потока из потоков для параллельного выполнения этих двух задач, это займет столько же времени, сколько и первая задача, то есть около 6 секунд.

Код: Выделить всё

import time
import threading

big_data = [ i for i in range( 10 ** 7, 10 ** 8 ) ]

def task1():
for data in big_data:
data
time.sleep( 5 )
for data in big_data:
data

def task2():
for data in big_data:
data

t1 = threading.Thread( target = task1, args = () )
t2 = threading.Thread( target = task2, args = () )

st = time.time()
t1.start()
t2.start()
t1.join()
t2.join()
et = time.time()

print( f"It took { et - st } seconds to do the two tasks." )
Если я сделаю это с помощью asyncio, аналогично, с той разницей, что задача 2 должна выполняться, пока мы находимся в 5-секундном периоде сна задачи 1.

Код: Выделить всё

import time
import asyncio

big_data = [ i for i in range( 10 ** 7, 10 ** 8 ) ]

async def task1():
for data in big_data:
data
await asyncio.sleep( 5 )
for data in big_data:
data

async def task2():
for data in big_data:
data

async def all_together():
await asyncio.gather( task1(), task2() )

st = time.time()
asyncio.run( all_together() )
et = time.time()

print( f"It took { et - st } seconds to do the two tasks." )
Пожалуйста, дайте мне знать, если я неправильно понимаю многопоточность и асинхронность. Первым шагом для меня, чтобы убедиться, что все идет так, как задумано, является, конечно же, выбор времени. Но использование потоков требует немного больше, чем последовательный запуск! Что не так в моем коде или чего мне здесь не хватает?
Затем я попробовал прочитать, но не из списка, а только счетчики цикла for, и на этот раз asyncio тоже занимает больше времени, чем последовательный запуск!

Код: Выделить всё

import time

def task1():
for i in range( 10 ** 7, 10 ** 8 ):
i
time.sleep( 5 )
for i in range( 10 ** 7, 10 ** 8 ):
i

def task2():
for i in range( 10 ** 7, 10 ** 8 ):
i

st = time.time()
task1()
task2()
et = time.time()

print( f"It took { et - st } seconds to do the two tasks." )

Код: Выделить всё

import time
import threading

def task1():
for i in range( 10 ** 7, 10 ** 8 ):
i
time.sleep( 5 )
for i in range( 10 ** 7, 10 ** 8 ):
i

def task2():
for i in range( 10 ** 7, 10 ** 8 ):
i

t1 = threading.Thread( target = task1, args = () )
t2 = threading.Thread( target = task2, args = () )

st = time.time()
t1.start()
t2.start()
t1.join()
t2.join()
et = time.time()

print( f"It took { et - st } seconds to do the two tasks." )

Код: Выделить всё

import time
import asyncio

async def task1():
for i in range( 10 ** 7, 10 ** 8 ):
i
await asyncio.sleep( 5 )
for i in range( 10 ** 7, 10 ** 8 ):
i
print( "done" )

async def task2():
for i in range( 10 ** 7, 10 ** 8 ):
i

async def all_together():
await asyncio.gather( task1(), task2() )

st = time.time()
asyncio.run( all_together() )
et = time.time()

print( f"It took { et - st } seconds to do the two tasks." )
Сейчас я использую Python 3.13 в Windows 11.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»