Резюме : в этой статье мы покажем вам, как сравнивать последовательные строки в одной и той же таблице, используя технику самостоятельного соединения.
Предположим, у вас есть таблица inventory, со структурой, определенной оператором CREATE TABLE, следующим образом:
CREATE TABLE inventory(
id INT AUTO_INCREMENT PRIMARY KEY,
counted_date date NOT NULL,
item_no VARCHAR(20) NOT NULL,
qty int(11) NOT NULL
);
В таблице inventory:
id — является автоинкрементными колонками.
counted_date — это подсчитанная дата.
item_no — код товара, размещенный в инвентаре.
qty — накопленное количество в запасе.
Ниже приведены примеры данных таблицы inventory:
INSERT INTO inventory(counted_date,item_no,qty)
VALUES ('2019-12-27','A',20),
('2019-12-27','A',30),
('2019-12-27','A',45),
('2019-12-27','A',80),
('2019-12-27','A',100);
Если вы хотите узнать, сколько предметов получено в день для каждого предмета, вам нужно сравнить количество наличных в конкретном дне с его предыдущим днем.
Другими словами, в таблице inventory необходимо сравнить строку с последовательной строкой, чтобы найти разницу.
В MySQL вы можете использовать технику самосоединения (self join) для сравнения последовательных строк как следующий запрос:
SELECT
g1.item_no,
g1.counted_date from_date,
g2.counted_date to_date,
(g2.qty - g1.qty) AS receipt_qty
FROM
inventory g1
INNER JOIN
inventory g2 ON g2.id = g1.id + 1
WHERE
g1.item_no = 'A';
Условие в предложении INNER JOIN g2.id = g1.id + 1 позволяет, конечно, сравнить текущую строку со следующей строкой в таблице inventory, предполагая, что в столбцах идентификаторов нет пробелов.
Если вы не можете избежать пробела, вы можете создать дополнительный столбец, например, seq, чтобы поддерживать последовательности строк, чтобы применить эту технику.
Из этой статьи вы узнали, как сравнивать последовательные строки в одной и той же таблице, используя технику самостоятельного соединения.
Почти каждый существующий сегодня сотовый телефон использует SIM-карту. «SIM» — это сокращение от модуля идентификации абонента. Без этого вы не можете делать или принимать телефонные звонки. Вы также не можете использовать интернет-данные через сотовую связь.
Вы, наверное, уже знали это, но почему ваш телефон так бесполезен без этого маленького куска металла и пластика? Просто для чего на самом деле используется SIM-карта?
Как выглядит SIM-карта
SIM-карту довольно легко идентифицировать. Это пластиковая карточка с четким набором металлических контактов. Внутри SIM-карты вы найдете интегральную схему, которая связывается с телефоном через вышеупомянутые металлические контакты.
SIM-карты бывают разных форм и размеров. На самом деле, всего четыре размера. Самый большой из них известен как «полноразмерный» и фактически устарел. Полноразмерные SIM-карты размером 3,37 на 2,125 дюйма в основном были размером со смарт-картами доступа.
Причина этого довольно интересная. На начальном этапе технологии мобильных телефонов несколько человек использовали один телефон. Идея заключалась в том, что вы вставите свою огромную SIM-карту в телефон, когда захотите ее использовать. Поскольку карта будет проводить больше времени в вашем кошельке, чем в телефоне, большой пластиковый корпус имеет смысл.
В наши дни большинство сим-карт, которые вы купите, имеют все три общих размера, с кусочками пластикового корпуса, отрывающимися до тех пор, пока вы не достигнете желаемого размера. Размер Mini-SIM довольно необычен в наши дни и в основном используется в устаревших устройствах или недорогих устройствах на основе старых конструкций.
Размер Micro-SIM очень популярен, и большинство телефонов используют его. Размер Nano-SIM устраняет практически весь пластиковый корпус вокруг контактов SIM-карты и, по сути, является стандартом для флагманов и смартфонов среднего класса, где внутреннее пространство чрезвычайно дорого. SIM-карты имеют физическую клавиатуру, что делает невозможным их неправильную установку.
Вот совет: не выбрасывайте рамки Mini- и Micro-SIM при получении новой SIM-карты. Если вам когда-нибудь понадобится перенести SIM-карту на другой телефон, они вам могут понадобиться!
Что делает SIM-карта?
Сотовая сеть, принадлежащая вашему поставщику услуг, это просто сеть. Они должны контролировать, кто имеет доступ к этой сети, как по соображениям безопасности, так и для того, чтобы все это работало!
Так что же такое SIM-карта? Ваша SIM-карта является картой доступа. Он содержит ваши учетные данные. Так что в этом смысле это как карта, на которой хранятся ваши имя пользователя и пароль. Вы входите в сотовую сеть с помощью SIM-карты. Ваш номер телефона — это ваша уникальная сетевая идентификация.
Независимо от того, куда вы направляетесь, пока вы находитесь в пределах досягаемости сотовой вышки, принадлежащей вашему поставщику услуг, вы можете связаться с другими.
Что хранится на SIM-карте?
На SIM-карте есть информация, необходимая для аутентификации вашей учетной записи в сети. Одним из них является ICCID или идентификатор карты интегральной схемы . Это номер, который уникален для этой конкретной физической SIM-карты.
Следующий важный бит данных на SIM-карте известен как ключ аутентификации . Это криптографический ключ, используемый для подписи данных, отправляемых в сотовую сеть. Их ключ запускается через криптографическую функцию и затем сравнивается с другим вычислением, выполненным с копией ключа, хранящегося в базе данных оператора. Если они совпадают, вы попадете в сеть.
На SIM-карте также есть память, которую вы можете использовать для хранения ваших контактов и текстовых сообщений. Это довольно ограничено, однако, с большинством SIM-карт, занимающих от 64 до 256 КБ. В наши дни большинству людей лучше хранить свои контакты в собственной памяти телефона вместе с резервной копией, используя что-то вроде iCloud или свою учетную запись Google .
Контрактные и предоплаченные SIM-карты
Обычно сотовые провайдеры используют две модели для продажи своих услуг клиентам. Вы можете подписать договор с фиксированным контрактом или быть клиентом с предоплатой.
В обоих случаях вы получите SIM-карту. Сами карты ничем не отличаются друг от друга. Скорее, именно как поставщик обрабатывает учетную запись, которая выделяет их. Вы можете купить предоплаченные SIM-карты с полки. Хотя во многих странах вы должны зарегистрировать покупку, используя правительственный ID и подтверждение места жительства.
Контрактным SIM-картам распределяются данные, время разговора и другие ресурсы в соответствии с вашим контрактом. Излишки добавляются к вашему счету, и в конце платежного цикла деньги списываются с вашего счета. С картами предоплаты вы обычно загружаете денежную сумму на SIM-карту или иным образом приобретаете время разговора или мобильные данные заранее.
В зависимости от того, где вы живете, некоторые контрактные телефоны могут быть заблокированы для SIM-карт только от этого поставщика. Часто это способ получить телефон с существенной скидкой, но если вам когда-нибудь понадобится использовать другую SIM-карту, возможно, во время путешествий, вы обнаружите, что она не работает! Чтобы избежать такой ситуации, обязательно ищите телефоны, продающиеся как «разблокированные».
Переключение SIM-карт
Взять SIM-карту с одного телефона и переместить ее на другой довольно безболезненно. Учитывая, что оба телефона используют одинаковый размер SIM-карты. Если другой телефон использует больший размер, вам придется использовать адаптер, чтобы он подходил для большего слота. Если SIM-карта, которую вы хотите использовать, слишком велика для целевого телефона, у вас есть два варианта.
Во-первых, сократить размер SIM-карты. Некоторые люди достаточно смелы, чтобы сделать это, используя только ножницы и какой-то шаблон. Если вы случайно врезались в схему SIM-карты, игра окончена, и вам понадобится новая. Самый безопасный способ сделать это — использовать специальный инструмент для резки SIM. Даже в этом случае вы рискуете уничтожить карту, поэтому выбирайте этот маршрут только на свой страх и риск.
Другим вариантом является переключение SIM-карт. Конечно, если вы просто выйдете и купите новую SIM-карту, с ней будет связан другой номер телефона! У каждого поставщика услуг может быть своя процедура перемещения вашего телефонного номера с одной SIM-карты на другую.
В целом, однако, нужно просто принять телефонный звонок и подтвердить вашу личность. Если у провайдера есть физические магазины, у вас даже должна быть возможность зайти на новую SIM-карту с отключенной старой.
В наши дни популярно использовать текстовые сообщения, отправленные на определенные SIM-карты, как форму двухфакторной аутентификации. Так что теперь у нас есть нечто, известное как мошенничество с обменом SIM-карт . Где преступники находят способы передачи вашего номера телефона на SIM-карту, которую они контролируют. Дублирование SIM-карты является еще одним методом. Это, безусловно, что-то, чтобы не упустить.
Жизнь после сим-карт
SIM-карты, по крайней мере, отдельные SIM-карты больше не нужны. Мы уже наблюдаем рост eSIM или встроенной SIM- карты. Это SIM-карта, встроенная непосредственно в телефон. Эта карта является программируемой, что означает, что вы можете легко менять поставщиков или использовать несколько поставщиков одновременно.
В некоторых странах телефоны с двумя SIM-картами пользуются большой популярностью. С ними вы можете иметь два телефонных номера, например, один для личного пользования. Вы также можете иметь специальную SIM-карту для передачи данных, возможно, с лучшими тарифами.
eSIM делает это избыточным и превращает доступ и аутентификацию во что-то похожее на использование фиксированной широкополосной связи. Где вы просто вводите имя пользователя и пароль для доступа к данному поставщику услуг.
Лишь немногие современные телефоны имеют встроенные SIM-карты на момент написания статьи, но ситуация изменится, когда отрасль примет этот новый стандарт. У вашего следующего телефона вполне может быть, что вообще некуда положить SIM-карту, что станет концом эпохи, но, безусловно, движением к лучшему.
Благодаря AMD летом 2019 года на наших компьютерах появилось новое оборудование PCI Express, которое обещает графические карты и твердотельные накопители, которые работают быстрее, чем когда-либо. Интерфейс PCI Express 4.0 предлагает удвоенную пропускную способность PCI Express 3.0 (PCIe 3), и он может сделать это для любых плат расширения, которые подключаются к вашей материнской плате. Теперь у нас есть как графические карты, так и твердотельные накопители, совместимые с PCI Express 4 (PCIe 4), доступные в магазинах. Вы можете спросить себя: обеспечивает ли PCIe 4 больше кадров в секунду при игре в игры? Это делает ваши SSD диски намного быстрее? Мы задавали себе те же вопросы, поэтому решили провести анализ производительности, в котором мы сравниваем PCIe 4 с PCIe 3
Как мы тестировали производительность PCI Express
Чтобы увидеть улучшения производительности, представленные PCI Express версии 4, мы использовали следующий тестовый компьютер:
Монитор: изогнутый игровой монитор ASUS ROG Strix XG32VQ (32-дюймовый WQHD 2560 x 1440, 144 Гц)
Блок питания: ASUS ROG Thor 850W Platinum
Операционная система: Windows 10 Pro x64 с обновлением ноября 2019 года
Наша материнская плата предлагает отличный BIOS UEFI , с большим количеством опций и настроек, которые вы можете настроить. Среди них вы можете найти и установить версию интерфейса PCI Express, используемую каждым слотом на материнской плате. Чтобы сравнить PCIe 4 с PCIe 3, мы сначала запустили все следующие тесты, сначала используя PCIe 4, который является настройкой по умолчанию. Затем мы настроили UEFI BIOS для ограничения интерфейса PCI Express для графического процессора и SSD на PCIe 3.
Давайте посмотрим, какие результаты мы получили, и дает ли PCI Express версии 4 существенные улучшения по сравнению с версией 3.
PCIe 4 против PCIe 3: вы получаете больше кадров в секунду в играх?
Мы начали с тестирования производительности, предлагаемой графической картой ASRock AMD Radeon RX 5700 XT Taichi X 8G OC + во время Второй мировой войны. Мы использовали Vulkan API и настройки качества графики Ultra. Когда мы использовали PCIe 4, мы увидели небольшое увеличение количества кадров в секунду по сравнению с PCIe 3. Цифры были на 3% лучше, в зависимости от того, на какую метрику мы смотрим: минимальный FPS, средний FPS или максимальный FPS.
Battlefield V — популярная игра, требующая достаточно много аппаратных ресурсов для отображения ее наилучшего качества графики. Для этого мы использовали DirectX 12 API и настройки качества Ultra. Независимо от разрешения, 1440p или 1080p, количество кадров в секунду, которое мы имели, было немного лучше, когда мы использовали PCIe 4 по сравнению с PCIe 3. Однако улучшения были до 2% при измерении среднего количества кадров в секунду.
Shadow of the Tomb Raider — выдающаяся игра с визуальной точки зрения качества. Мы протестировали его, используя DirectX 12, TAA (временное сглаживание) и самые высокие предустановки качества графики. Результаты наших тестов были практически идентичны, независимо от того, использовали ли мы разрешения 1440p или 1080p и PCIe 4 или PCIe 3. Как ни странно, максимальный FPS был выше на PCIe 3, поэтому кажется, что переключение с PCIe 3 на PCIe 4 не не имеет никакого эффекта.
The Division 2 от Tom Clancy предлагает инструмент для сравнительного анализа, который выводит только средний FPS. Используя DirectX 12 и предустановку качества графики Ultra, мы получили такое же количество кадров в секунду при использовании разрешения 1080p с PCIe 4 и PCIe 3. В 1440p PCIe 4 выдавал на 4% больше кадров в секунду, чем PCIe 3.
Metro Exodus — одна из последних игр с высокими требованиями к оборудованию. Полученные нами результаты были неубедительными, и мы не заметили каких-либо улучшений при использовании PCIe 4 вместо PCIe 3.
Мы также тестировали ASRock AMD Radeon RX 5700 XT Taichi X 8G OC + в Fortnite, которая не является требовательной, но очень популярной. Реализация Fortnite DirectX 12 находится на стадии бета-тестирования, и результаты со временем изменятся. Мы заметили улучшение среднего числа FPS до 44% в разрешении 1080p и до 27% в разрешении 1440p.
Мы перешли к Apex Legends, еще одной популярной онлайн-игре Battle Royale. Мы использовали самые высокие настройки качества графики, и результаты, которые мы измерили, снова оказались неубедительными. В этой игре не было значимого влияния при переходе с PCIe 3 на PCIe 4.
За исключением Fortnite, мы не заметили значительных улучшений в количестве кадров в секунду, воспроизводимых в играх. В большинстве игр частота кадров увеличивается на 4% при использовании PCIe 4 вместо PCIe 3. В некоторых играх нет разницы между двумя версиями PCIe.
PCIe 4 против PCIe 3: загружаются ли игры быстрее?
Мы протестировали видеокарту ASRock AMD Radeon RX 5700 XT Taichi X 8G OC + с тестом 3DMark PCI Express. Этот тест измеряет пропускную способность, доступную для графической карты через интерфейс PCI Express. Его результат говорит нам о средней достигнутой пропускной способности и, таким образом, дает приблизительное представление о том, как быстро игры могут передавать данные во время загрузки. Когда мы настроили нашу материнскую плату на использование PCI Express 4, видеокарта имела доступ к средней пропускной способности 23,25 ГБ / с. Ограничение интерфейса PCI Express до Gen 3 означало, что доступная пропускная способность упала до 14,31 ГБ / с. Другими словами, использование PCIe 4 означает, что графическая карта может получить на 39% большую пропускную способность по сравнению с PCIe 3.
Наличие графической карты, поддерживающей PCI Express 4, означает, что вы можете быстрее загружать игры, в которые играете.
PCIe 4 против PCIe 3: Windows 10 загружается быстрее?
Чтобы узнать, ускоряет ли PCIe 4 загрузку Windows 10, мы использовали BootRacer . Наш тестовый компьютер имел одинаковое время запуска независимо от того, настроили ли мы SSATA-накопитель ADATA XPG Gammix S50 на PCIe 4 или PCIe 3.
PCIe 4 против PCIe 3: данные записываются и читаются быстрее на диске?
Мы загрузили и запустили CrystalDiskMark, эталон, который может измерять производительность SSD при чтении и записи данных, как случайных, так и последовательных. Измерения показали, что, хотя случайная передача данных не сильно пострадала, последовательная передача данных значительно лучше, когда вы используете PCIe 4 вместо PCIe 3 для SSD-накопителя. Скорость последовательного чтения данных была до 61% быстрее, в то время как скорость последовательной записи данных была до 46% быстрее.
Наличие твердотельного накопителя PCI Express 4 значительно повышает скорость последовательной передачи данных: от 46% для скорости записи до 61% для скорости чтения.
PCIe 4 улучшает производительность по сравнению с PCIe 3?
Вот что вы получаете, когда используете PCIe 4 вместо PCIe 3:
Вы получаете более быстрое время загрузки в играх
Копирование и перемещение больших файлов в Windows 10 быстрее
Однако, когда вы играете в игры, это не влияет на количество кадров в секунду, которое вы получаете. Только в нескольких названиях вы можете увидеть улучшения до 4%. Кроме того, Windows 10 не загружается быстрее при использовании PCIe 4 вместо PCIe 3.
Вы купили оборудование PCIe 4?
Если вы потратили деньги на видеокарту PCIe 4 или твердотельный накопитель, какова была ваша основная причина для этого? Стоило ли оно того в вашем конкретном случае? Мы хотели PCIe 4, потому что, да, в некоторых ситуациях это означает большую производительность. Однако это также означает дополнительные расходы. Прежде чем закончить, расскажите нам свою точку зрения на эту тему в комментарии ниже.
Сегодня в этой статье по Python мы увидим многопроцессорную работу с Python. Кроме того, мы рассмотрим пакет и структуру многопроцессорной обработки в Python. Кроме того, мы обсудим класс процесса в Python Multiprocessing, а также получим информацию о процессе. Чтобы это произошло, мы заимствуем несколько методов из модуля многопоточности. Наряду с этим мы изучим блокировку и пул класса Python Multiprocessing.
Итак, давайте начнем.
2. Что такое многопроцессорная обработка Python?
Сначала поговорим о параллельной обработке. Это способ одновременно разбивать и запускать программные задачи на нескольких микропроцессорах. По сути, это попытка сократить время обработки и это то, чего мы можем достичь с помощью компьютера с двумя или более процессорами или с использованием компьютерной сети. Мы также называем это параллельными вычислениями.
Итак, теперь перейдем к Python Multiprocessing, это способ повысить производительность путем создания параллельного кода. Производители процессоров делают это возможным, добавляя больше ядер к своим процессорам. В многопроцессорной системе приложения разбиваются на более мелкие подпрограммы для самостоятельной работы. Взгляните на однопроцессорную систему. Учитывая несколько процессов одновременно, он пытается прерывать и переключаться между задачами. Как бы вы себя чувствовали, будучи единственным шеф-поваром на кухне с сотнями клиентов? Вы должны были бы выполнять все обычные задачи от выпечки до замеса теста.
а. Пакет многопроцессорной обработки Python
Многопроцессорная обработка в Python — это пакет, который мы можем использовать с Python для порождения процессов с использованием API, который очень похож на модуль потоков . Благодаря поддержке как локального, так и удаленного параллелизма, он позволяет программисту эффективно использовать несколько процессоров на данном компьютере. Прежде чем мы сможем объяснить вам это, давайте рассмотрим пример пула — объекта, способа распараллеливания выполнения функции по входным значениям и распределения входных данных по процессам. Это параллелизм данных (создайте из этого модуль и запустите его):
from multiprocessing import Pool
def f(x):
return x*x
with Pool(5) as p:
print(p.map(f,[1,2,3]))
Хотите узнать, сколько ядер у вашей машины? Попробуйте метод cpu_count().
Так из чего состоит такая система? У нас есть следующие возможности:
Мультипроцессор — компьютер с несколькими центральными процессорами.
Многоядерный процессор — один вычислительный компонент с более чем одной независимой фактической единицей обработки/ядрами.
В любом случае, процессор может выполнять несколько задач одновременно, назначая процессор для каждой задачи.
3. Класс многопроцессорного процесса Python
Давайте сначала поговорим о классе Process в Python Multiprocessing. Это абстракция для настройки другого процесса, позволяющая родительскому приложению контролировать выполнение. Здесь мы наблюдаем методы start() и join(). Давайте сначала возьмем пример.
import multiprocessing
from multiprocessing import Process
def testing():
print("Объектов")
def square(n):
print("Число квадратов в ",n**2)
def cube(n):
print("Количество кубиков в ",n**3)
if __name__=="__main__":
p1=Process(target=square,args=(7,))
p2=Process(target=cube,args=(7,))
p3=Process(target=testing)
p1.start()
p2.start()
p3.start()
p1.join()
p2.join()
p3.join()
print("Мы закончили")
Мы сохранили на нашем рабочем столе, а затем дважды запустили из командной строки.
Давайте разберемся с этим фрагментом кода. Process() позволяет нам создать экземпляр класса Process. start() говорит Python начать обработку. Но тогда, если мы позволим этому быть, это потребляет ресурсы, и мы можем исчерпать их в более поздний момент времени. Это потому, что он позволяет процессу оставаться бездействующим и не завершаться. Чтобы избежать этого, мы вызываем метод join(). При этом нам не нужно убивать их вручную. Присоединение останавливает выполнение текущей программы до завершения процесса. Это гарантирует, что программа ожидает завершения p1 и затем завершения p2. Затем он выполняет следующие операторы программы. И последнее: аргумент ключевого слова args позволяет нам указать значения передаваемого аргумента. Кроме того, цель позволяет нам выбрать функцию для выполнения процесса.
4. Получение информации о процессах
а. Получение идентификатора процесса и проверка работоспособности
Мы можем захотеть получить ID процесса или одного из его дочерних элементов. Мы также можем захотеть узнать, жив ли он еще. Следующая программа демонстрирует эту функциональность:
import multiprocessing
from multiprocessing import Process
import os
def child1():
print("Child 1",os.getpid())
def child2():
print("Child 2",os.getpid())
if __name__=="__main__":
print("Parent ID",os.getpid())
p1=Process(target=child1)
p2=Process(target=child2)
p1.start()
p2.start()
p1.join()
alive='Yes' if p1.is_alive() else 'No'
print("Is p1 alive?",alive)
alive='Yes' if p2.is_alive() else 'No'
print("Is p2 alive?",alive)
p2.join()
print("Мы закончили")
В многопроцессорной среде Python каждый процесс занимает свое собственное пространство памяти для запуска независимо. Завершается, когда целевая функция завершается выполнением.
б. Получение названия процесса
Мы также можем установить имена для процессов, чтобы мы могли получить их, когда захотим. Это сделано для того, чтобы сделать его более читабельным.
import multiprocessing
from multiprocessing import Process, current_process
import os
def child1():
print(current_process().name)
def child2():
print(current_process().name)
if __name__=="__main__":
print("Parent ID",os.getpid())
p1=Process(target=child1,name='Child 1')
p2=Process(target=child2,name='Child 2')
p1.start()
p2.start()
p1.join()
p2.join()
print("Мы закончили")
Как видите, метод current_process() дает нам имя процесса, который вызывает нашу функцию. Посмотрите, что происходит, когда мы не присваиваем имя одному из процессов:
import multiprocessing
from multiprocessing import Process, current_process
import os
def child1():
print(current_process().name)
def child2():
print(current_process().name)
if __name__=="__main__":
print("Parent ID",os.getpid())
p1=Process(target=child1)
p2=Process(target=child2,name='Child 2')
p1.start()
p2.start()
p1.join()
p2.join()
print("Мы закончили")
Что ж, модуль многопроцессорной обработки Python присваивает номер каждому процессу как часть его имени, когда мы этого не делаем.
5. Многопроцессорная блокировка Python
Как и многопоточный модуль, многопроцессорная обработка в Python поддерживает блокировки. Процесс включает в себя импорт Lock, его использование, выполнение чего-либо, а затем освобождение. Давайте взглянем.
В следующем фрагменте кода мы заставляем процесс получить блокировку, пока он выполняет свою работу.
from multiprocessing import Process, Lock
lock=Lock()
def printer(item):
lock.acquire()
try:
print(item)
finally:
lock.release()
if __name__=="__main__":
items=['nacho','salsa',7]
for item in items:
p=Process(target=printer,args=(item,))
p.start()
Давайте запустим этот код трижды, чтобы увидеть, какие разные результаты мы получаем.
Блокировка не позволяет потокам мешать друг другу. Следующий процесс ожидает снятия блокировки, прежде чем продолжить.
6. Класс многопроцессорного пула Python
Этот класс представляет пул рабочих процессов; его методы позволяют переложить задачи на такие процессы. Давайте рассмотрим пример (Создайте модуль и запустите его).
from multiprocessing import Pool
def double(n):
return n*2
if __name__=='__main__':
nums=[2,3,6]
pool=Pool(processes=3)
print(pool.map(double,nums))
Мы создаем экземпляр пула и создаем процесс с 3 работниками. map() отображает функцию double и повторяемость для каждого процесса.
Другой метод, который возвращает нам результаты наших процессов в пуле, — это метод apply_async().
from multiprocessing import Pool
def double(n):
return n*2
if __name__=='__main__':
pool=Pool(processes=3)
result=pool.apply_async(double,(7,))
print(result.get(timeout=1))
Итак, все это было в многопроцессорной обработке Python. Надеюсь, вам понравится наше объяснение.
7. Вывод — многопроцессорная обработка Python
В этой статье по многопроцессорности Python мы обсудили полную концепцию многопроцессорности в Python. Кроме того, мы рассмотрели пул многопроцессорных процессов Python, блокировку и процессы. Теперь у вас есть представление о том, как использовать ваши процессоры в полной мере.
Описание: в этой статье вы узнаете, как использовать переменную SELECT INTO в MySQL для хранения результатов запроса в переменных.
Синтаксис переменной SELECT INTO в MySQL
Чтобы сохранить результат запроса в одной или нескольких переменных , используйте синтаксис переменной SELECT INTO:
SELECT
c1, c2, c3, ...
INTO
@v1, @v2, @v3,...
FROM
table_name
WHERE
condition;
В этом синтаксисе:
c1, c2 и c3 — это столбцы или выражения, которые вы хотите выбрать и сохранить в переменных.
@ v1, @ v2 и @ v3 — это переменные, в которых хранятся значения из c1, c2 и c3.
Количество переменных должно совпадать с количеством столбцов или выражений в списке выбора. Кроме того, запрос должен возвращать ноль или одну строку.
Если запрос не возвращает строк, MySQL выдает предупреждение об отсутствии данных и значение переменных остается неизменным.
Если запрос возвращает несколько строк, MySQL выдает ошибку. Чтобы запрос всегда возвращал максимум одну строку, используйте условие LIMIT 1, чтобы ограничить результирующий набор одной строкой.
Примеры переменной SELECT INTO в MySQL
Мы будем использовать таблицу customers в примере базы данных для демонстрации.
Пример одной переменной SELECT INTO в MySQL
Следующий оператор получает город клиента с номером 103 и сохраняет его в переменной @city:
SELECT
city
INTO
@city
FROM
customers
WHERE
customerNumber = 103;
Следующий оператор отображает содержимое переменной @city:
SELECT
@city;
Пример нескольких переменных SELECT INTO в MySQL
Чтобы сохранить значения из списка выбора в несколько переменных, вы разделяете переменные запятыми. Например, следующий оператор находит город и страну клиента с номером 103 и сохраняет данные в двух соответствующих переменных @city и @country:
SELECT
city,
country
INTO
@city,
@country
FROM
customers
WHERE
customerNumber = 103;
Следующий оператор показывает содержимое переменных @city и @country:
SELECT
@city,
@country;
Пример нескольких строк SELECT INTO в MySQL
Следующая инструкция вызывает ошибку, потому что запрос возвращает несколько строк:
SELECT
creditLimit
INTO
@creditLimit
FROM
customers
WHERE
customerNumber > 103;/
Вот вывод:
Error Code: 1172. Result consisted of more than one row
Чтобы исправить это, вы используете следующее предложение LIMIT 1:
SELECT
creditLimit
INTO
@creditLimit
FROM
customers
WHERE
customerNumber > 103
LIMIT1;
В этой статье вы узнали, как использовать синтаксис переменной SELECT INTO в MySQL для хранения результата запроса результата в одной или нескольких переменных.
Домашний Сервер: Часть 5 – Настройка Plex Media Server в контейнере LXC Proxmox-VE (вы тут)
Предисловие
Ну вот мы и добрались до самого медиасервиса с помощью которого можно просматривать свою медиатеку.
Познакомился я с Plex еще лет пять назад, тогда он был проще, но позволял делать все, что необходимо.
Кратко, что такое Plex? — По сути это медиа «комбайн» или центр управления, с помощью которого вы можете удобно хранить, искать и воспроизводить свой медиа контент и это не только фильмы или сериалы, это могут быть изображения и музыка. Командой Plex выпущены приложения для различного типа устройств, чтобы можно было начать смотреть фильм дома на большом экране и досмотреть например его в дороге.
Скажу сразу — это не реклама. От слова «совсем». Просто на текущий момент это единственная грамотная система для просмотра локальной медиатеки на различных устройствах, причем абсолютно бесплатно!
Установка Plex Media Server
В первую очередь необходимо развернуть отдельный LXC контейнер для медиасервера.
Создадим файл источника для установки и обновлений.
nano /etc/apt/sources.list.d/plexmediaserver.list
# Plexmediaserver
deb https://downloads.plex.tv/repo/deb public main
Обновляем репозитории
apt update
Подготовка завершена, устанавливаем Plex Media Server
apt install plexmediaserver
При окончании установки появится запрос замены файла репозитория.
Я рекомендую оставить вариант по умолчанию. Т.е. не заменять файл репозитория созданный нами, на файл предлагаемый пакетом Plex
Файл настройки "/etc/apt/sources.list.d/plexmediaserver.list"
==> Файл, созданный вами или сценарием.
==> Также, файл в пакете, предоставленный сопровождающим пакета.
Что нужно сделать? Есть следующие варианты:
Y или I : установить версию, предлагаемую сопровождающим пакета
N или O : оставить установленную на данный момент вермию
D : показать различия между версиями
Z : запустить оболочку командной строки для проверки ситуации
По умолчанию сохраняется текущая версия файла настройки.
*** plexmediaserver.list (Y/I/N/O/D/Z) [по умолчанию N] ?
Дожидаемся окончания процесса установки и запуска.
Проверяем запущен ли Plex
service plexmediaserver status
Если видим то, что ниже, значит все хорошо.
Active: active (running)
Сервер Plex будет работать по IP адресу контейнера.
WEB интерфейс запущен на TCP порту 32400 и еще необходимо указать дополнительный путь /web/
netstat -nltp4
tcp 0 0 0.0.0.0:32400 0.0.0.0:* LISTEN 27590/Plex Media
Откроем в браузере свой сервер набрав IP адрес и порт. У меня IP контейнера 192.168.88.8
192.168.88.8:32400/web/
После входа, Plex запросит вашу Учетную запись. Если у вас её нет, то будет необходимо пройти простую процедуру регистрации. Благо есть возможность заходить через учетные записи Google или Facebook.
После входа вас вернет на локальный сервер.
Вводное информационное окно
Далее необходимо выполнить первичную настройку Локального Сервера
Введите желаемое имя сервера
Можете сразу добавить библиотеки если знаете как 🙂
Предлагает загрузить приложения на различные устройства.
После данного этапа сервером уже можно начинать пользоваться. Но есть еще некоторые вещи, которые упростят пользование данным сервисом и сделают его более понятным для пользователя владеющим Русским языком.
Установка и настройка nginx
Т.к. у нас есть DNS, реализуем вход по доменному имени, например у меня plex.gregory-gost.ru
Как видите никаких портов и дополнительных путей вводить при этом не требуется.
Сравните, что удобнее, понятнее и привычнее?
192.168.88.8:32400/web/
или
plex.gregory-gost.ru
Для этого используем реверс прокси.
Ставим nginx, останавливаем, удаляем базовый сайт «hello world» и добавляем свои настройки.
apt install nginx
service nginx stop
rm /etc/nginx/sites-enabled/default
nano /etc/nginx/nginx.conf
error_log /var/log/nginx/error.log crit;
pid /var/run/nginx.pid;
worker_rlimit_nofile 8192;
timer_resolution 100ms;
include /etc/nginx/modules-enabled/*.conf;
events {
multi_accept on;
accept_mutex off;
use epoll;
}
http {
include /etc/nginx/mime.types;
include /etc/nginx/fastcgi.conf;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
#ssl_session_cache shared:SSL:10m;
#ssl_session_timeout 10m;
include /etc/nginx/conf.d/*.conf;
}
Запускаем nginx и проверяем вход по доменному имени
service nginx start
Установка плагина Kinopoisk
Plex поддерживает различные плагины, которые немного упрощают жизнь. Для того, чтобы фильмы в библиотеке обрабатывались корректно и метаданные по ним скачивались на Русском языке можно и не ставить данный плагин. Plex умеет по умолчанию работать с The Movie Database (TMDb) и подгружает русские названия с описанием и постеры от туда. Правда рейтинг также берется с TMDb.
Благо есть «в нашем селении» способные умельцы. Уважаемый amirotin разработал плагин, который парсит метаданные с Кинопоиска.
С декабря 2019 года, amirotin перестал заниматься плагином и его поддержку на себя взял ziemenz.
Возможности плагина:
Загрузка рейтингов для фильмов
Kinopoisk
Rotten Tomatoes
IMDb
The Movies Database
Источники рецензий на фильмы
Kinopoisk
Rotten Tomatoes
Загрузка трейлеров фильмов
Загрузка дополнительных материалов (сцены, интервью)
Загрузка английских имен актеров
Приоритет локализованных обложек фильмов
Поддержка прокси-серверов (http, sock5)
Я надеюсь, что данный плагин не является нарушением авторских или каких-либо других прав компании ООО «Яндекс» (владеет Кинопоиском с 15 октября 2013 г.) т.к. это не коммерческий софт
У себя, я использую Релизную версию плагина 2.0.1 от 29 февраля 2020 г.: Стабильный релиз v2.0.1
Переименовываем папку т.к. она содержит лишнее «2.0.1»
mv Kinopoisk.bundle-2.0.1 Kinopoisk.bundle
Даем права для Plex Media Server на папку
chown -R plex:plex Kinopoisk.bundle/
Финальный вариант работающего Plex Media Server
Скриншот Web интерфейса Plex Media Server
Некоторые настройки Plex Media Server
Покажу некоторые настройки, которые у меня установлены для Plex Media Server.
В основном это настройки библиотек и плагинов обработки для них, остальные вы можете изучить самостоятельно, благо все на Русском языке.
Для фильмов Кинопоиск 2.0
Для сериалов The Movie Database т.к. плаин Кинопоиска пока не умеет работать с сериалами.
Изображения кликабельны:
Список библиотек согласно структуре хранения
Настройки библиотеки Фильмы 2D
Настройки библиотеки Фильмы 2D
Настройки библиотеки Фильмы 2D
Настройки библиотеки Фильмы 2D
Настройки библиотеки Фильмы 2D
Настройки библиотеки Фильмы 3D
Настройки библиотеки Сериалы
Настройки библиотеки Сериалы
Настройки библиотеки Сериалы
Финальные настройки библиотеки Сериалы
TV Приставки и приложения для просмотра
И еще, немного затронем то, на чем все это великолепие можно смотреть!
Я использую на текущий момент:
Xiaomi Mi Box S (MDZ-22-AB) Global Version — Использую на текущий момент. Все устраивает полностью, Android TV с приложением Plex, удобный Bluetooth пульт. (5 990 руб. на дату написания статьи в магазине Xiaomi. На Ali дешевле.)
Raspberry Pi 3B+ с LibreELEC 9.2.0 — Установлен скрипт Plex с автозапуском. Пока единственный нормальный Custom по опыту. В целом задачи решает, но не так удобен, как Mi Box S на Android TV. Я писал статью по использованию: Домашний Медиа-плеер: LibreELEC(Kodi) на Raspberry Pi 3B+. Но планирую заменить на какой-нибудь Smart Box
Что еще можно использовать?
Google Chromecast Ultra — Собственно плеер на Android TV от самого Google, функции аналогичные Mi Box S, но нет в комплекте Bluetooth пульта.
Nvidia Shield TV 2019 — Обновленная «приставка» от Nvidia. С пультом, аналог Mi Box S и Google Chromecast Ultra, но дороже (13 990 руб. на дату написания статьи в магазине Nvidia)
Nvidia Shield TV Pro 2019 — Более прокачанная версия «шилда» причем Plex Media Server уже встроен в этот медиаплеер, что конечно сомнительно всего 16Гб места, часть из которого занимает система. Даже с учетом возможности подключения HDD/SSD. (17 590 руб. на дату написания статьи в магазине Nvidia)
Другие китайские или Российские(российско-китайские?) приставки на базе простого Android, CoreELEC, Android TV, др. — Ценники начиная от 1 500 руб. (Ugoos, H96, X96, X88, Movix Pro и т.д. и т.п.)
Приложение PlexApp (офф версия требует PlexPass) — Есть, как для iOS так и для Android. Ставится на любой планшет, смартфон и т.д.Присутствует на некоторых Smart TV, тут вам нужно изучить набор приложений для вашего телевизора.
Если хотите нормальные UHD(«4K» Ultra HD 2160p) с HDR и Автофреймрейтом, то смотрите в сторону Ugoos AM6+ или Pro, Nvidia Shield TV 2019 Pro
Для FHD(Full HD 1080p) Xiaomi Mi Box S побюджетней.
Если что-то забыл, пишите в комментариях, добавлю 🙂
Заключение
На этой радостной ноте предлагаю, закончить свое повествование по реализации Домашнего медиа сервера. Мы своего добились, фильмы и сериалы качаются на раз-два, просмотр доставляет одно удовольствие, ПК не захламлен кучей фильмов.
Возможно существуют и альтернативы Plex-у, в виде каких-то DLNA клиентов или даже тот-же Kodi, но все они не так удобны и проработаны, что дает очевидный выбор в пользу Plex. Даже при наличии различного рода сервисов, которые избыточны для домашнего локального просмотра, Plex их не навязывает и они не заметны. Это позволяет использовать его с комфортом.
Мне остается только понадеятся на грамотное развитие данной системы в будущем и пожелать его авторам успехов.
А вам дорогие читатели находить новые решения, использовать все самое лучшее и делиться впечатлениями!
В рамках цикла «Домашний сервер» планирую еще две статьи
The Dude — мониторинг девайсов в домашней сети.
FreePBX (Asterisk) — IP телефония.
А вот реализация Домашнего IoT пойдет в отдельный цикл, чтобы было проще ориентироваться в дальнейшем. Посмотрим будет ли интерсено читателям )
openHAB 2 — домашний IoT.
Благодарю за ваше время!
Всего хорошего на просторах Интернета 😉
UPD: 29.02.2020
Изменен источник и инструкция для плагина Kinopoisk.