Какая бывает резьба: Типы резьб и их характеристики
alexxlab | 04.01.1970 | 0 | Разное
Отличия метрической и дюймовой резьбы. Элементы резьб.
Метрический и дюймовый крепеж – это крепеж, который распространен на территории Великобритании и Америки, а так же стран содружественных с ними. Дюймовый крепеж имеет отличительный внешний вид (от метрического) за счет шага резьбы (UNC и UNF), мерой длины является – дюйм, а угол при вершине 55° или 60°. Метрический крепеж имеет более широкую сферу производства, измеряется в миллиметрах и имеет угол при вершине только 60°.
Резьбы по системе мер делятся на метрическую и дюймовую. Метрическая и aдюймовая резьба применяется в резьбовых соединениях и винтовых передачах. Резьбовыми называют разъемные соединения, выполняемые с помощью резьбовых крепежных деталей – болтов, винтов, гаек, шпилек или резьбы, непосредственно нанесенной на соединяемые детали.
Метрическая резьба (рис. 1)
Имеет в профиле вид равностороннего треугольника с углом при вершине, равном 60°. Вершины выступов сопрягающихся винта и гайки срезаны. Характеризуется метрическая резьба диаметром винта в миллиметрах и шагом резьбы в миллиметрах. Метрическую резьбу выполняют с крупным и мелким шагом. За основную принята резьба с крупным шагом. Мелкую резьбу применяют для регулировки, для свинчивания тонкостенных, а также динамически нагруженных деталей. Метрическую резьбу с крупным шагом обозначают буквой М и числом, выражающим номинальный диаметр в миллиметрах, например М20. Для мелкой метрической резьбы дополнительно указывают шаг, например М20х1,5.
Дюймовая резьба (рис. 2)
Дюймовая резьба (рис. 2) имеет в профиле такой же вид, как метрическая резьба, но у нее угол при вершине равен 55° (резьба Витворта – британский стандарт BSW (Ww) и BSF), угол при вершине равен 60° (американский стандарт UNC и UNF). Hаpужный диаметp pезьбы измеpяется в дюймах (1″ = 25,4мм) – штpихи (“) обозначают дюйм. Характеризуется эта резьба числом ниток на один дюйм. Дюймовую американскую резьбу выполняют с крупным (UNC) и мелким (UNF) шагом.
Дюймовая нарезка делится на крепежные и трубные типы, бывает цилиндрическая, конусная и характеризуется такими показателями:
- наружным диаметром;
- внутренним диаметром;
- шагом;
- областью расположения;
- профилем поверхности;
- направлением сечения;
- высотой профиля;
- количеством заходов.
- и другим.
Точность и поле допуска метрической резьбы
Класс точности | Поле допуска для резьбы | ||||||
---|---|---|---|---|---|---|---|
наружной: болт, винт, шпилька | внутренней: гайка | ||||||
Точный | 4g | 4h | 4H | 5H | |||
Средний | 6d | 6e | 6f | 6g | 6h | 6G | 6H |
Грубый | 8g | 8h | 7G | 7H |
Таблица размеров крепежных изделий для американской дюймовой машиностроительной резьбы UNC с крупным шагом (угол профиля 60 градусов)
Размер в дюймах | Размер в мм | Шаг ниток / дюйм |
---|---|---|
UNC № 1 | 1.854 | 64 |
UNC № 2 | 2.184 | 56 |
UNC № 3 | 2.515 | 48 |
UNC № 4 | 2.845 | 40 |
UNC № 5 | 3.175 | 40 |
UNC № 6 | 3.505 | 32 |
UNC № 8 | 4.166 | 32 |
UNC № 10 | 24 | |
UNC № 12 | 5.486 | 24 |
UNC 1/4 | 6.35 | 20 |
UNC 5/16 | 7.938 | 18 |
UNC 3/8 | 9.525 | 16 |
UNC 7/16 | 11.11 | 14 |
UNC 1/2 | 12.7 | 13 |
UNC 9/16 | 14.29 | 12 |
UNC 5/8 | 15.88 | 11 |
UNC 3/4 | 19.05 | 10 |
UNC 7/8 | 22.23 | 9 |
UNC 1″ | 25.4 | 8 |
UNC 1 1/8 | 28.58 | 7 |
UNC 1 1/4 | 31.75 | 7 |
UNC 1 1/2 | 34.93 | 6 |
UNC 1 3/8 | 38.1 | 6 |
UNC 1 3/4 | 44.45 | 5 |
UNC 2″ | 50.8 | 4 1/2 |
Резьба
Резьба может быть внутренней и наружной.
- На болтах, шпильках, винтах, штифтах и на разных других цилиндрических деталях нарезают наружную резьбу;
- В фасонных частях, гайках, во фланцах, в пробках, деталях машин и металлических конструкциях нарезают внутреннюю резьбу.
Основные элементы резьб представлены на рис. 3 К ним относятся следующие элементы:
- шаг резьбы – расстояние между вершинами или основаниями двух соседних витков;
- глубина резьбы – расстояние от вершины резьбы до ее основания;
- угол профиля резьбы – угол, заключенный между боковыми сторонами профиля в плоскости оси;
- наружный диаметр – наибольший диаметр резьбы болта, измеряемый по вершине резьбы перпендикулярно к оси резьбы;
- внутренний диаметр – расстояние, равное диаметру цилиндра, на которой навернута нитка резьбы.
- Моменты затяжки крепежныйх изделий с дюймовой резьбой стандарта США
Ещё о дюймовом крепеже:
Дюймовая продукция, поставляемая компанией «Трайв-Комплект»
Материалы подготовлены специалистами компании «Трайв-Комплект».
При копировании текстов и других материалов сайта – указание
ссылки на сайт www.traiv-komplekt.ru обязательно!
Просмотров: 162505
ВИДЫ РЕЗЬБЫ Резьба на современных крепежных элементах имеет следующие основные параметры: – шаг расстояние между двумя соседними витками резьбы. Шаг резьбы измеряется либо в миллиметрах как расстояние (прямой способ измерения), либо как количество витков резьбы на единицу длины крепежного элемента (косвенный способ измерения). В нашей стране принято измерять шаг резьбы прямым способом. При монтаже быстрее вкручиваются крепежные элементы, имеющие больший шаг резьбы (т.е. меньшее количество витков резьбы на единицу длины). – внешний диаметр диаметр крепежного элемента с учетом выступающей части витков резьбы. – внутренний диаметр диаметр крепежного элемента в углублениях между витками резьбы. – угол вершины угол на вершине витков резьбы. Если рассматривать крепежные элементы, врезающиеся при монтаже резьбой в основание, то чем острее угол резьбы, тем меньшее сопротивление вкручиванию оказывает материал основания.По типу резьба на крепежных элементах может быть внутренней (на гайках, соединительных муфтах, гильзах анкеров и т.п.) и внешней (на шурупах, саморезах, болтах и т.д.) По виду резьба бывает метрической и неметрической. Часто вместо последнего термина используют термин «дюймовая», противопоставляя метрическую и дюймовую системы измерения длин. Тем не менее, параметры как неметрической, так и метрической резьбы могут быть выражены в любой из вышеупомянутых систем измерения. Для этого существуют специальные таблицы перевода параметров крепежных элементов из одной системы в другую. Необходимость использования таких таблиц возникла в ходе интенсификации международной торговли, т.к. на разных географических рынках используются разные системы измерения длин: например, в США и Великобритании к крепежным элементам применяются обозначения параметров в дюймах, в континентальной Европе в миллиметрах. Так, для обозначения диаметра крепежных элементов в странах с дюймовой системой измерения длин используются так называемые «калибры» или «размеры»:
Наиболее распространенными сегодня подвидами резьбы являются: 1. Резьба с широким шагом. 2. Разреженная резьба. 3. Резьба с мелким шагом. 4. Метрическая резьба. 5. Двухзаходная (переменная) резьба состоит из чередующихся высоких и низких витков. Фактически это две резьбы с одинаковым шагом, одна из которых нанесена посередине между витками другой. Разница в высоте между высокой и низкой резьбой обычно составляет от 40 до 50% от высоты высокой резьбы. 6. Ударная (зонтичная) резьба состоит из толстых покатых витков с тупым углом вершины.
Каждый вид резьбы имеет свое функциональное предназначение. Пригодность резьбового крепежного элемента для использования в том или ином материале основания определяется в первую очередь видом резьбы. Чем плотнее материал основания, тем меньший шаг резьбы необходим для качественного закрепления. Так, шурупы по дереву имеют резьбу с широким шагом, а саморезы по металлу резьбу с мелким шагом либо метрическую. Там, где закрепляемый элемент монтируется в ПВХ и подвержен опасности выдергивания, используются крепежные элементы с двухзаходной резьбой. Двухзаходня резьба также используется, если необходимо достичь прочного закрепления в разнородных материалах закрепляемого элемента и основания. Разреженная резьба предназначена для закрепления в мягкие или пористые материалы (например, мягкие породы дерева). Ударная резьба используется в резьбовых крепежных элементах, монтаж которых осуществляется более быстрым по сравнению со вкручиванием ударным способом. Демонтаж крепежных элементов с ударной резьбой осуществляется традиционным методом выкручивания.
UNF/UTS – дюймовая резьба нашедшая широкое распространенние в США И Канаде. Профиль резьбы UN/UNF: угол при вершине 60°, теоретическая высота профиля H=0,866025P. Угол при вершине и высота профиля полностью соответствует метрическим резьбам, однако все размеры основаны на дюймовой системе измерения и указываются в долях дюйма. Резьбы UNC Thread ANSI B1.1
UNC (Unified Coarse Thread) – Унифицированная крупная резьба.
Старое обозначение резьбы NC. Резьбы UNC и NC взаимозаменяемы.
Резьбы UNF ANSI B1.1 UNF (Unified National Fine Thread) – Унифицированная мелкая резьба.
Буквенное обозначение основных международных стандартов резьбы
|
размеры в мм и дюймах по диаметру, стандартная резьба
Содержание:
Любой мастер, работающий в области сантехники, должны быть знаком с трубной резьбой и ее разновидностями. Стандартная трубная резьба имеет определенные параметры, собранные в единую таблицу. При осуществлении работ по монтажу сантехнического оборудования важно придерживаться установленных стандартов. Иначе полученное некачественное соединение может привести к неисправностям в трубопроводе.
Разновидности резьбовых насечек
Резьбовыми насечками называют ряды выемок, располагающихся по спирали. Нанесение винтового рельефа может выполняться на элементы в форме цилиндра или конуса. При этом на всем протяжении требуется соблюдение одинакового шага и величины диаметра. Такая резьба используется при создании винтовых соединений. Основная область использования – автомобилестроение и коммуникационные системы.
Винтовой рельеф может быть двух видов:
Трубная насечка считается отдельной разновидностью. Ее делают на элементах, изготовленных из металла и полимерных материалов. Чаще всего трубной насечкой пользуются при сборке систем бытового назначения, таких как водоснабжение и отопление.
Виды трубной резьбы и размеры
Резьба оценивается по нескольким критериям:
- Направление и расположение.
- Профильные элементы, здесь речь идет о выступах и выемках, которые отлично видны на продольном разрезе.
- Величина, взятая в качестве единицы измерения профильных элементов. Измеряются размеры трубных резьб в мм или дюймах.
- Внутренний поперечник. Эта величина у разных деталей измеряется по-разному: на болтах – по рельефным выемкам, на гайках – по внешнему профилю.
- Шаг резьбы определяет расстояние между двумя соседними витками, расположенными параллельно.
При осмотре довольно трудно установить вид и размеры трубной резьбы. Для этой цели используется штангенциркуль. А полученные в результате измерения параметры сравнивают с табличными данными.
Трубной дюймовой и метрической резьбе соответствуют разные размеры. Главным определяющим параметром является поперечное сечение. Причем определяется метрическая резьба по диаметру трубы и шагу. Дюймовая нарезка характеризуется количеством витков, которое приходится на один дюйм или долю дюйма. Однако стоит учитывать, что по сравнению со стандартным дюймом, величина которого 2,54 см, трубный дюйм имеет отличие и равен 3,324 см.
В отличие от метрической трубная дюймовая резьба имеет свою конфигурацию: более острые выемки и закругленные выпуклые части резьбы. Разное определение имеет шаг дюймового и метрического скручивания. В первом случае необходимо пересчитать витки, приходящиеся на один дюйм. Во втором случае берется конкретный отрезок, пересчитываются витки на этом участке, затем длину отрезка делят на число витков. Расчет необходимо проводить с точностью до десятой доли. Иначе насечка получится ненадлежащего качества. Читайте также: “Какая бывает трубная резьба и как она выполняется”.
Насечки выполняются тремя способами:
- Накатом в процессе изготовления трубы.
- Нарезка на специальном токарном оборудовании.
- Ручное нарезание метчиком и плашкой.
Трубное крепление цилиндрической формы
Высокой прочностью и надежностью характеризуется состыковка методом скручивания, хотя этот вариант достаточно прост в использовании. Единственным недостатком является необходимость использования пакли для большей герметизации. Такая ситуация возникает очень редко, когда требуется максимальная прочность соединения.
С помощью трубной резьбы достигается герметичное скручивание не только труб, но и других тонкостенных конструкций, имеющих цилиндрическую форму. В разрезе винтовая насечка имеет вид равнобедренного треугольника, верхний угол которого равен 550. Главный параметр винтовой насечки для цилиндров – условный диаметр. Если при нанесении винтовой насечки во внимание принимается внешний и внутренний диаметр, то условный важен для качественного монтажа сантехники.
Под определением условного диаметра понимается показатель, который определяет пропускную способность трубного изделия. Измеряется данный показатель в дюймах. У каждого условного значения имеется соответствующие параметры внешнего и внутреннего диаметра.
Метод скручивания допускается использовать на трубах, диаметр которых не превышает 6 дюймов. В остальных случаях применяется сварочное оборудование.
Цилиндрический рельеф имеет свое условное обозначение: трубная резьба g 1. Далее следуют обозначения диаметра и класса точности.
Для транспортировки горячей и холодной воды в большинстве случаев используются чугунные трубы с трубной резьбой из стали. Объясняется это качественными характеристиками материала. Чугунные изделия более хрупкие, стальные – более прочные, что способствует повышению качества креплений. Допускается нанесение цилиндрических насечек на трубные изделия, имеющие диаметр от 1/16 до 6 дюймов.
Конические дюймовые насечки
Для элементов, крепление которых должно иметь повышенную прочность, используют коническую дюймовую резьбу. В частности речь идет о трубопроводах, в которых рабочая среда характеризуется повышенным давлением. Помимо этого, монтаж стальных подземных трубопроводов, расположенных на большой глубине, также проводится с использованием конических насечек.
Такие соединения в обязательном порядке должны иметь дополнительную герметизацию. Наружная резьба конического винтового рельефа имеет обозначение R, внутренняя – Rc. Стыковка такого вида наносится на конусный профиль, то есть на элементы, у которых величина диаметра меньше в конце трубы, чем в начале. В процессе скручивания наблюдается деформация витков, в результате этого получается надежное соединение металлических элементов.
С помощью конусной дюймовой резьбы соединяются элементы водопроводов, газопроводов и отопительных систем. Широко используется метрический конусный рельеф, отличительной особенностью которого является создание соединений с внешней конической насечкой и внутренней цилиндрической винтовой насечкой.
Круглая метрическая резьба
На стеклянные, керамические и жестяные детали наносят круглую резьбу. Такая скрутка может выдержать большие нагрузки. Скручивание и раскручивание элементов выполняется без особого труда, поэтому такая стыковка может использоваться при многократном разъединении. В основном применяется на вентилях, для смесителей и кранов, а также в цоколе электрической лампочки.
Крепление резьбовое NPSM
NPSM – дюймовая цилиндрическая американская резьба. Продольный разрез показывает треугольник, вершина которого равна 600. Является одним из видов цилиндрического крепления, но имеет обширный диапазон, от 1/16 до 24 дюймов. Выполнить такую насечку можно только в заводских условиях.
Резьба по дереву: виды и особенности
Обработкой древесины человек занимается с самых древних времён. Изделия из дерева стали первыми предметами домашнего обихода и пользовались заслуженной любовью. Одновременно с их появлением зарождалась и резьба по дереву.
Народные мастера умело пользовались спецификой материала, показывая его скромную красоту и практичность. Они придавали своим изделиям удобные формы с художественной завершённостью. В большей своей части умельцы старались совместить красивый декор с практическим бытовым и хозяйственным предназначением.
Резьба по дереву практически сгруппировалась в несколько видов:
- домовая;
- объёмная;
- контурная;
- геометрическая;
- плоскорельефная;
- рельефная;
- резьба на пряничных досках.
Самые древние столярные мастера использовали весьма примитивные орудия: топор, долото, струг, ложкарь и тесло. Первыми образцами народного искусства резьбы по дереву были уточки и деревянные кони. Создавались и целые скульптурные произведения. До наших дней дошёл деревянный олень, изготовленный в 5-2 в.в. до н.э.
В средневековье резьба имела растительные орнаменты, украшавшие жилые дома, алтари, иконы. Нередко встречались сказочные мотивы. С 16 века искусство обработки дерева принимает объёмные формы, высокие и живописные. В более поздний период деревянные украшения стали основой убранства соборов, церквей, богатых домов. В 18-19 веках практически каждый дом имел индивидуальный характер, благодаря искусной резьбы по дереву.
Домовая резьба
Основной характеристикой домовой резьбы по дереву является её крупномасштабность. Она выполняется с помощью простейшего инструмента: топора, долото и пилы. Используется дерево хвойных пород.
Резьба по дереву для украшения домов была хорошо развита уже более пяти веков назад. На севере России сохранились самые древние деревянные постройки, украшенные резьбой. Много деревянных резных домов встречается и в Поволжье.
Многие исследователи считают, что искусство украшать жилые постройки резьбой перешло из кораблестроения. Часто домовая и корабельная резьба подразумевает под собой одно и то же. Домовая резьба подразделяется на объёмную, рельефную и прорезную.
Вероятно, первой объёмной резьбой были украшены носовые части кораблей. На них присутствовали фигуры птицы, коня, оленя. Рельефная резьба украшает фронтоны домов, окна, наличники. Прорезной вид появился в 19 веке. Ажурные украшения выпиливались лобзиком и украшали дома, перила, входы в помещения.
Объёмная резьба
Объёмная резьба по дереву наиболее сложный вид обработки древесины. Ещё её называют – скульптурной. Этот вид характеризуется тем, что изготавливаемое изображение как бы отдалено от общего фона. Образует рельеф, скульптуру или целую скульптурную группу.
Объёмная резьба требует от резчика настоящего мастерства. Ошибки здесь не прощаются. Для изготовления применяются специальные инструменты.
Фигурками из дерева украшали жилища ещё в Древней Руси. Мастерили так же игрушки, фигурки животных, вырезали свистульки. Объёмная резьба широкое применение нашла в церкви, где ею украшали алтари, вырезали образа святых, вырезали кресты.
К объёмной резьбе относиться и корнепластика. Для неё берут нижнюю часть дерева, имеющую самые разнообразные формы, и создают оригинальные образы.
Контурная резьба
Контурная резьба относится к орнаментной резьбе. С 15 века она широко представлена в народном искусстве. Выполняется контурная резьба по дереву в виде прямолинейных линий, прорезаемых по контуру прилагаемого рисунка.
Отдалённо такая резьба напоминает гравировку. Она имеет чётко обозначенный рисунок, довольно сухой и простой. Композицию часто несколько оживляют разнообразные прорезки и окрашивание.
Для такой резьбы применяют специальный нож и изогнутую стамеску. Со стороны видится простота резьбы, но это не так. Она требует большого мастерства, так как здесь необходимо обходиться без зарезов и сколов древесины.
Контурная резьба по дереву наиболее распространена в Поволжье и северных областях.
Геометрическая резьба
Этот вид резьбы по дереву наиболее простой и доступный многим умельцам. Геометрическая резьба представляет собой особые клинорезные выемки, различной направленности и глубины. Количество граней, в каждой отдельной выемки, также может быть различным. Но, наиболее распространённые – это с двумя и тремя выемками.
Трёхгранная резьба даёт наибольшее количество возможных узоров. Меньше композиций можно создать с помощью четырёхгранной резьбы, и она требует особого мастерства от резчика.
К геометрической резьбе можно и отнести скобчатую резьбу. Рисунок в ней изготавливается полукруглой стамеской, сначала под прямым углом, а затем, под острым. Для резьбы по дереву геометрической берут древесину липы, осины, хвойных пород.
Плоскорельефная и рельефная резьба
Плоскорельефная резьба так же очень распространена. Отличительной её особенностью является орнамент одинаковой высоты. Часто композиции создаются простым рисунком: геометрические фигуры, листья растений, изображения зверей и птиц.
Резьба по дереву такого вида потребует от мастера усидчивости, богатой фантазии и разнообразного инструмента: ножей, стамесок, чеканов, скребков, рашпилей и др.
Этот вид резьбы различают по подвидам:
- подушечный фон;
- подобранный фон;
- заоваленный контур.
В рельефной резьбе рисунок заметно выделяется на общем фоне. В этом виде практически нет плоских поверхностей. Узор содержит точки различной высоты и формы. Рельефной резьбой украшают мебель, стены, делают изящные панно.
Рельефная резьба по дереву делиться на два подвида: барельефную и горельефную. Для резьбы выбирают твёрдое дерево: дуб, бук, кедр, пихту.
Резьба на пряничных досках
Это наиболее древняя форма резьбы по дереву. Известны сохранившиеся доски, датированные 12 и 13 веками. Деревянные формы пряничных досок использовались для изготовления праздничных печных пряников.
Резьба по дереву таких досок в большинстве своём имеет крупновырезанные надписи по всем четырём сторонам. В центре создавался забавный рельефный рисунок. Изготовление пряничных досок доверялась самым лучшим мастерам.
Метрическая резьба: таблица размеров и стандартный шаг метрических резьб
Время прочтения статьи: 15 минут
Автор статьи: pkmetiz.ru
Надежность крепежных соединений достигается за счет резьбы. Она представляет собой чередование впадин и выступов на внутренней и внешней поверхности вращающихся деталей. Существует множество разновидностей резьбы: дюймовая, трубная, шуруповертная и метрическая. В этой статье более подробно описана метрическая резьба и ее особенности, поскольку именно она является наиболее универсальной и востребованной из всех перечисленных.
Резьбовые соединения применяются везде, где нужен крепеж, и для передачи движения. У каждой разновидности резьбовых соединений есть ряд типовых характеристик:
- Профиль резьбы — рисунок «гребенки», которая проходит вдоль оси крепежа.
- Шаг резьбы — расстояние между двумя соседними вершинами, замеренное вдоль оси стержня элемента крепежа.
- Наружный диаметр — измеряется по верхним точкам профиля.
- Внутренний диаметр — размер вписанного цилиндра в углубления наружной резьбы, либо по точкам вершин внутренней.
- Ход резьбы — расстояние от одной вершины профиля до другой в проекции на ось крепежа.
- Угол профиля резьбы — угол между боковыми сторонами профиля.
Также существуют другие параметры резьбы: высота профиля, длина ввинчивания, количество витков. В метрической резьбе профиль состоит из равносторонних треугольников. Угол профиля метрической резьбы составляет 60º. Нормативы размеров стандартного шага устанавливает ГОСТ 8724-81 (ИСО 261-98) «Основные нормы взаимозаменяемости. Резьба метрическая. Диаметры и шаги». Согласно этому документу, на поверхностях диаметром 1–68 мм шаг резьбы может быть крупным или мелким. При диаметре поверхности крепежного элемента свыше 68 мм метрическая резьба может иметь только мелкий шаг. Каждому диаметру соответствует один вариант крупного шага резьбы, и несколько вариантов мелкого шага. Например, при диаметре 10 мм возможен крупный шаг в 1,5 мм и три варианта мелкого шага. Крупный шаг в обозначении метрической резьбы опускается, поскольку его значение всегда неизменно, и его можно узнать по таблице.
Полное наименование резьбы состоит из следующих данных:
- М — метрическая резьба.
- Диаметр резьбы в миллиметрах.
- Размер мелкого шага в миллиметрах.
- Направление хода (есть левосторонняя и правосторонняя резьба).
- Обозначение хода для многозаходной резьбы.
Шаг метрической резьбы определяют по таблице, или по маркировке крепежного элемента. Кроме табличных и справочных данных, существуют и практические способы определения шага резьбового профиля:
- Можно сравнить резьбу на разных изделиях, и определить искомое значение путем сопоставления.
- Для измерения шага применяют резьбовые калибры — специальные инструменты без шкалы. Калибры помогают определить различные параметры резьбового профиля: диаметры, высоту треугольника, длину шага.
- Если наружная резьба легко и без сопротивления ввинчивается во внутреннюю, так можно предположительно установить шаг наружного профиля.
- Проведите измерения: с помощью штангенциркуля определите длину резьбы и разделите полученное значение на число витков.
Еще один важный параметр резьбового соединения — поле допуска. Эта величина обозначает максимальную длину сопряжения сторон резьбовых профилей винта и гайки, и других разновидностей крепежных изделий. Существует три класса полей допусков. Если крепеж принадлежит к первому классу допусков, он является надежным и применяется в областях, где требуется высокая точность и надежная фиксация. Второй класс полей допусков — это наиболее часто используемый стандарт. Грубый класс допусков используется там, где не требуется большая точность резьбового соединения.
При выборе крепежа тип резьбового соединения имеет решающее значение. На территории Российской Федерации наиболее востребованы метизы с крупным шагом резьбы. Крепежные элементы с мелким шагом применяются для соединения изделий, подверженных вибрации, экспериментальным и переменным динамическим нагрузкам. Область применения метизов с мелким шагом резьбового профиля — автомобиле- и судостроение, производство станков, электроники и бытовой техники. В строительстве и других сферах в основном используется крепеж с крупным шагом метрической резьбы. Если требуется рассчитать, какие болты требуются для определенных строительных или иных задач, современные специалисты используют расчетные формулы, либо специальное программное обеспечение. Расчет параметров крепежа онлайн доступен на многих специализированных интернет-ресурсах бесплатно. Также существуют онлайн-калькуляторы для подсчета параметров метрической резьбы по набору исходных размеров. Необходимые размеры рекомендуется замерять с помощью штангенциркуля.
Под метрической резьбой также принято подразумевать любую резьбу, обозначение которой указано в миллиметрах. По форме профиля различают следующие типы резьбы:
- Дюймовая — профиль состоит из равнобедренных треугольников, угол при вершине у которых составляет 55о.
- Трубная цилиндрическая — разновидность дюймовой резьбы, соответствует стандартам ГОСТ 6357-81. Номинальный размер резьбы соотносится с внутренним диаметром трубы или условно определенного отверстия.
- Трапецеидальная — профиль выглядит как трапеция с равными боковыми сторонами и острым углом при основании. Этот вид резьбы применяется в подвижных соединениях и служит для передачи возвратно-поступательного движения. Трапецеидальная резьба бывает однозаходной и многозаходной.
- Упорная — разновидность трапецеидальной, профиль выглядит как не равнобочная трапеция. Соответствует нормам ГОСТ 10177-82.
- Прямоугольная — этот вид резьбы выполняется на ходовых винтах, испытывающих высокие нагрузки, для передачи поступательно-вращательного движения.
- Круглая — профиль выглядит как частный случай синусоиды. Этот тип резьбы отличается значительной устойчивостью к частому закручиванию и раскручиванию. Пример использования — цоколь лампочки (резьба Эдисона), шпиндели, вентили, сантехнический крепеж и арматурные изделия.
Кроме миллиметров для измерения резьбовых соединений также используют другие системы мер: дюйм, модуль — отношение шага в миллиметрах к числу пи, питч — отношение числа пи к шагу, длина которого указана в дюймах.
Таблица метрических резьб
Шаг резьбы Р | Диаметр резьбы | |||
наружный | средний | внутренний | внутренний по дну впадины | |
С к р у п н ы м ш а г о м | ||||
0,40 | 2,0 | 1,740 | 1,567 | 1,509 |
0,45 | (2,2) | 1,908 | 1,713 | 1,648 |
0,45 | 2,5 | 2,208 | 2,013 | 1,948 |
0,50 | 3,0 | 2,675 | 2,459 | 2,387 |
0,60 | (3,5) | 3,110 | 2,850 | 2,764 |
0,70 | 4 | 3,546 | 3,242 | 3,141 |
0,75 | (4,5) | 4,013 | 3,688 | 3,580 |
0,80 | 5 | 4,480 | 4,134 | 4,019 |
1 | 6 | 5,350 | 4,918 | 4,773 |
1,25 | 8 | 7,188 | 6,647 | 6,466 |
1,50 | 10 | 9,026 | 8,376 | 8,160 |
1,75 | 12 | 10,863 | 10,106 | 9,853 |
2 | (14) | 12,701 | 11,835 | 11,546 |
2 | 16 | 14,701 | 13,835 | 13,546 |
2,5 | (18) | 16,376 | 15,294 | 14,933 |
2,5 | 20 | 18,376 | 17,294 | 16,933 |
2,5 | (22) | 20,376 | 19,294 | 18,933 |
3 | 24 | 22,051 | 20,752 | 20,319 |
3 | (27) | 25,051 | 23,752 | 23,319 |
3,5 | 30 | 27,727 | 26,211 | 25,706 |
3,5 | (33) | 30,727 | 29,211 | 28,706 |
4 | 36 | 33,402 | 31,670 | 31,093 |
4 | (39) | 36,402 | 34,670 | 34,093 |
4,5 | 42 | 39,077 | 37,129 | 36,479 |
4,5 | (45) | 42,077 | 40,129 | 39,479 |
5 | 48 | 44,752 | 42,587 | 41,866 |
5 | (52) | 48,752 | 46,587 | 45,866 |
5,5 | 56 | 52,428 | 50,046 | 49,252 |
5,5 | (60) | 56,428 | 54,046 | 53,252 |
6 | 64 | 60,103 | 57,505 | 56,639 |
6 | (68) | 64,103 | 61,505 | 60,639 |
С м е л к и м ш а г о м | ||||
0,25 | 2,0 | 1,838 | 1,729 | 1,693 |
2,2 | 2,038 | 1,929 | 1,893 | |
0,35 | 2,5 | 2,273 | 2,121 | 2,071 |
3 | 2,773 | 2,621 | 2,571 | |
(3,5) | 3,273 | 3,121 | 3,071 | |
0,5 | 4 | 3,675 | 3,459 | 3,387 |
(4,5) | 4,175 | 3,959 | 3,887 | |
5 | 4,675 | 4,459 | 4,387 | |
6 | 5,675 | 5,459 | 5,387 | |
8 | 7,675 | 7,459 | 7,387 | |
10 | 9,675 | 9,459 | 9,387 | |
12 | 11,675 | 11,459 | 11,387 | |
(14) | 13,675 | 13,459 | 13,387 | |
16 | 15,675 | 15,459 | 15,387 | |
(18) | 17,675 | 17,459 | 17,387 | |
20 | 19,675 | 19,459 | 19,387 | |
(22) | 21,675 | 21,459 | 21,387 | |
0,75 | 6 | 5,513 | 5,188 | 5,080 |
8 | 7,513 | 7,188 | 7,080 | |
10 | 9,513 | 9,188 | 9,080 | |
12 | 11,513 | 11,188 | 11,080 | |
(14) | 13,513 | 13,188 | 13,080 | |
16 | 15,513 | 15,188 | 15,080 | |
(18) | 17,513 | 17,188 | 17,080 | |
20 | 19,513 | 19,188 | 19,080 | |
(22) | 21,513 | 21,188 | 21,080 | |
24 | 23,513 | 23,188 | 23,080 | |
(27) | 26,513 | 26,188 | 26,080 | |
30 | 29,513 | 29,188 | 29,080 | |
(33) | 32,513 | 32,188 | 32,080 | |
1,0 | 8 | 7,350 | 6,917 | 6,773 |
10 | 9,350 | 8,917 | 8,773 | |
12 | 11,350 | 10,917 | 10,773 | |
(14) | 13,350 | 12,917 | 12,773 | |
16 | 15,350 | 14,917 | 14,773 | |
(18) | 17,350 | 16,917 | 16,773 | |
20 | 19,350 | 18,917 | 18,773 | |
(22) | 21,350 | 20,917 | 20,773 | |
24 | 23,350 | 22,917 | 22,773 | |
(27) | 26,350 | 25,917 | 25,773 | |
30 | 29,350 | 28,917 | 28,773 | |
36 | 35,350 | 34,917 | 34,773 | |
(39) | 38,350 | 37,917 | 37,773 | |
42 | 41,350 | 40,917 | 40,773 | |
(45) | 44,350 | 43,917 | 43,773 | |
48 | 47,350 | 46,917 | 46,773 | |
(52) | 51,350 | 50,917 | 50,773 | |
56 | 55,350 | 54,917 | 54,773 | |
(60) | 59,350 | 58,917 | 58,773 | |
64 | 63,350 | 62,917 | 62,773 | |
(68) | 67,350 | 66,917 | 66,773 | |
72 | 71,350 | 70,917 | 70,773 | |
(76) | 75,350 | 74,917 | 74,773 | |
80 | 79,350 | 78,917 | 78,773 | |
1,25 | 10 | 9,188 | 8,647 | 8,466 |
12 | 11,188 | 10,647 | 10,467 | |
(14) | 13,188 | 12,647 | 12,466 | |
1,5 | 12 | 11,026 | 10,376 | 10,160 |
(14) | 13,026 | 12,376 | 12,160 | |
16 | 15,026 | 14,376 | 14,160 | |
(18) | 17,026 | 16,376 | 16,160 | |
20 | 19,026 | 18,376 | 18,160 | |
(22) | 21,026 | 20,376 | 20,160 | |
24 | 23,026 | 22,376 | 22,160 | |
(27) | 26,026 | 25,376 | 25,160 | |
30 | 29,026 | 28,376 | 28,160 | |
(33) | 32,026 | 31,376 | 31,160 | |
36 | 35,026 | 34,376 | 34,160 | |
(39) | 38,026 | 37,376 | 37,160 | |
42 | 41,026 | 40,376 | 40,160 | |
(45) | 44,026 | 43,376 | 43,160 | |
48 | 47,026 | 46,376 | 46,160 | |
(52) | 51,026 | 50,376 | 50,160 | |
56 | 55,026 | 54,376 | 54,160 | |
(60) | 59,026 | 58,376 | 58,160 | |
64 | 63,026 | 62,376 | 62,160 | |
(68) | 67,026 | 66,376 | 66,160 | |
72 | 71,026 | 70,376 | 70,160 | |
(76) | 75,026 | 74,376 | 74,160 | |
80 | 79,026 | 78,376 | 78,160 | |
(85) | 84,026 | 83,376 | 83,160 | |
90 | 89,026 | 88,376 | 88,160 | |
(95) | 94,026 | 93,376 | 93,160 | |
100 | 99,026 | 98,376 | 98,160 | |
110 | 109,026 | 108,376 | 108,160 | |
(115) | 114,026 | 113,376 | 113,160 | |
(120) | 119,026 | 118,376 | 118,160 | |
125 | 124,026 | 123,376 | 123,160 | |
(130) | 129,026 | 128,376 | 128,160 | |
140 | 139,026 | 138,376 | 138,160 | |
(150) | 149,026 | 148,376 | 148,160 | |
2,0 | (18) | 16,701 | 15,835 | 15,546 |
20 | 18,701 | 17,835 | 17,546 | |
(22) | 20,701 | 19,835 | 19,546 | |
24 | 22,701 | 21,835 | 21,546 | |
(27) | 25,701 | 24,835 | 24,546 | |
30 | 28,701 | 27,835 | 27,546 | |
(33) | 31,701 | 30,835 | 30,546 | |
36 | 33,701 | 32,835 | 32,546 | |
(39) | 37,701 | 36,835 | 36,546 | |
42 | 40,701 | 39,835 | 39,546 | |
(45) | 43,701 | 42,835 | 42,546 | |
48 | 46,701 | 45,835 | 45,546 | |
(52) | 50,701 | 49,835 | 49,546 | |
56 | 54,701 | 53,835 | 53,546 | |
(60) | 58,701 | 57,835 | 57,546 | |
64 | 62,701 | 61,835 | 61,546 | |
(68) | 66,701 | 65,835 | 65,546 | |
72 | 70,701 | 69,835 | 69,546 | |
(76) | 74,701 | 73,835 | 73,546 | |
80 | 78,701 | 77,835 | 77,546 | |
(85) | 83,701 | 82,835 | 82,546 | |
90 | 88,701 | 87,835 | 87,546 | |
(95) | 93,701 | 92,835 | 92,546 | |
100 | 98,701 | 97,835 | 97,546 | |
(105) | 103,701 | 102,835 | 102,546 | |
110 | 108,701 | 107,835 | 107,546 | |
(115) | 113,701 | 112,835 | 112,546 | |
(120) | 118,701 | 117,835 | 117,546 | |
125 | 123,701 | 122,835 | 122,546 | |
(130) | 128,701 | 127,835 | 127,546 | |
140 | 138,701 | 137,835 | 137,546 | |
(150) | 148,701 | 147,835 | 147,546 | |
160 | 158,701 | 157,835 | 157,546 | |
(170) | 168,701 | 167,835 | 167,546 | |
180 | 178,701 | 177,835 | 177,546 | |
(190) | 188,701 | 187,835 | 187,546 | |
200 | 198,701 | 197,835 | 197,546 | |
3,0 | 30 | 28,051 | 26,752 | 26,319 |
(33) | 31,051 | 29,752 | 29,319 | |
36 | 34,051 | 32,752 | 32,319 | |
(39) | 37,051 | 35,752 | 35,319 | |
42 | 40,051 | 38,752 | 38,319 | |
(45) | 43,051 | 41,752 | 41,319 | |
48 | 46,051 | 44,752 | 44,319 | |
(52) | 50,051 | 48,752 | 48,319 | |
56 | 54,051 | 52,752 | 52,319 | |
(60) | 58,051 | 56,752 | 56,319 | |
64 | 62,051 | 60,752 | 60,319 | |
(68) | 66,051 | 64,752 | 64,319 | |
72 | 70,051 | 68,752 | 68,319 | |
(76) | 74,051 | 72,752 | 72,319 | |
80 | 78,051 | 76,752 | 76,319 | |
(85) | 83,051 | 81,752 | 81,319 | |
90 | 88,051 | 86,752 | 86,319 | |
(95) | 93,051 | 91,752 | 91,319 | |
100 | 98,051 | 96,752 | 96,319 | |
(105) | 103,051 | 101,752 | 101,319 | |
110 | 108,051 | 106,752 | 106,319 | |
(115) | 113,051 | 111,752 | 111,319 | |
(120) | 118,051 | 116,752 | 116,319 | |
125 | 123,051 | 121,752 | 121,319 | |
(130) | 128,051 | 126,752 | 126,319 | |
140 | 138,051 | 136,752 | 136,319 | |
(150) | 148,051 | 146,752 | 146,319 | |
160 | 158,051 | 156,752 | 156,319 | |
(170) | 168,051 | 166,752 | 166,319 | |
180 | 178,051 | 176,752 | 176,319 | |
(190) | 188,051 | 186,752 | 186,319 | |
200 | 198,051 | 196,752 | 196,319 | |
(210) | 208,051 | 206,752 | 206,319 | |
220 | 218,051 | 216,752 | 216,319 | |
(240) | 238,051 | 236,752 | 236,319 | |
250 | 248,051 | 246,752 | 246,319 | |
(260) | 258,051 | 256,752 | 256,319 | |
280 | 278,051 | 276,752 | 276,319 | |
(300) | 298,051 | 296,752 | 296,319 | |
4,0 | 42 | 39,402 | 37,670 | 37,093 |
(45) | 42,402 | 40,670 | 40,093 | |
48 | 45,402 | 43,670 | 43,093 | |
(52) | 49,402 | 47,670 | 47,093 | |
56 | 53,402 | 51,670 | 51,093 | |
60 | 57,402 | 55,670 | 55,093 | |
64 | 61,402 | 59,67 | 59,093 | |
72 | 69,402 | 67,670 | 67,093 | |
(76) | 73,402 | 71,670 | 71,093 | |
80 | 77,402 | 78,670 | 75,093 | |
(85) | 82,402 | 80,670 | 80,093 | |
90 | 87,402 | 85,670 | 85,093 | |
(95) | 92,402 | 90,670 | 90,093 | |
100 | 97,402 | 95,670 | 95,093 | |
(105) | 102,402 | 100,670 | 100,093 | |
110 | 107,402 | 105,670 | 105,093 | |
(115) | 112,402 | 110,670 | 110,093 | |
(120) | 117,402 | 115,670 | 115,093 | |
125 | 122,402 | 120,670 | 120,093 | |
(130) | 127,402 | 125,670 | 125,093 | |
140 | 137,402 | 135,670 | 135,093 | |
(150) | 147,402 | 145,670 | 145,093 | |
160 | 157,402 | 155,670 | 155,093 | |
(170) | 167,402 | 165,670 | 165,093 | |
180 | 177,402 | 175,670 | 175,093 | |
(190) | 187,402 | 185,670 | 185,093 | |
200 | 197,402 | 195,670 | 195,093 | |
(210) | 207,402 | 205,670 | 205,093 | |
220 | 217,402 | 215,670 | 215,093 | |
(240) | 237,402 | 235,670 | 235,093 | |
(260) | 257,402 | 255,670 | 255,093 | |
280 | 277,402 | 275,670 | 275,093 | |
300 | 297,402 | 295,670 | 295,093 |
Таблица метрических резьб
по ГОСТ 24705-2004
Номинальный диаметр резьбы d, мм | Шаг Р, мм | Диаметры резьбы, мм | |||
d = D | d2 = D2 | d1 = D1 | d3 | ||
0,25 | 0,075 | 0,250 | 0,201 | 0,169 | 0,158 |
0,3 | 0,08 | 0,30 | 0,248 | 0,213 | 0,202 |
0,35 | 0,09 | 0,350 | 0,292 | 0,253 | 0,240 |
0,4 | 0,1 | 0,40 | 0,335 | 0,292 | 0,277 |
0,45 | 0,450 | 0,385 | 0,342 | 0,327 | |
0,5 | 0,125 | 0,50 | 0,419 | 0,365 | 0,347 |
0,55 | 0,550 | 0,469 | 0,415 | 0,397 | |
0,6 | 0,15 | 0,60 | 0,503 | 0,438 | 0,416 |
0,7 | 0,175 | 0,70 | 0,586 | 0,511 | 0,485 |
0,8 | 0,2 | 0,80 | 0,670 | 0,583 | 0,555 |
0,9 | 0,225 | 0,90 | 0,754 | 0,656 | 0,624 |
1 | 0,25 | 1,0 | 0,838 | 0,729 | 0,693 |
0,2 | 1,0 | 0,870 | 0,783 | 0,755 | |
1,1 | 0,25 | 1,10 | 0,938 | 0,829 | 0,793 |
0,2 | 1,10 | 0,970 | 0,883 | 0,855 | |
1,2 | 0,25 | 1,20 | 1,038 | 0,929 | 0,893 |
0,2 | 1,20 | 1,070 | 0,983 | 0,955 | |
1,4 | 0,3 | 1,40 | 1,205 | 1,075 | 1,032 |
0,2 | 1,40 | 1,270 | 1,183 | 1,155 | |
1,6 | 0,35 | 1,60 | 1,373 | 1,221 | 1,171 |
0,2 | 1,60 | 1,470 | 1,383 | 1,355 | |
1,8 | 0,35 | 1,80 | 1,573 | 1,421 | 1,371 |
0,2 | 1,80 | 1,670 | 1,583 | 1,555 | |
2 | 0,4 | 2,0 | 1,740 | 1,567 | 1,509 |
0,25 | 2,0 | 1,838 | 1,729 | 1,693 | |
2,2 | 0,45 | 2,20 | 1,908 | 1,713 | 1,648 |
0,25 | 2,20 | 2,038 | 1,929 | 1,893 | |
2,5 | 0,45 | 2,50 | 2,208 | 2,013 | 1,948 |
0,35 | 2,50 | 2,273 | 2,121 | 2,071 | |
3 | 0,5 | 3,0 | 2,675 | 2,459 | 2,387 |
0,35 | 3,0 | 2,773 | 2,621 | 2,571 | |
3,5 | 0,6 | 3,50 | 3,110 | 2,850 | 2,764 |
0,35 | 3,50 | 3,273 | 3,121 | 3,071 | |
4 | 0,7 | 4,0 | 3,545 | 3,242 | 3,141 |
0,5 | 4,0 | 3,675 | 3,459 | 3,387 | |
4,5 | 0,75 | 4,50 | 4,013 | 3,688 | 3,580 |
0,5 | 4,50 | 4,175 | 3,959 | 3,887 | |
5 | 0,8 | 5,0 | 4,480 | 4,134 | 4,019 |
0,5 | 5,0 | 4,675 | 4,459 | 4,387 | |
5,5 | 0,5 | 5,50 | 5,175 | 4,959 | 4,887 |
6 | 1 | 6,0 | 5,350 | 4,917 | 4,773 |
0,75 | 6,0 | 5,513 | 5,188 | 5,080 | |
0,5 | 6,0 | 5,675 | 5,459 | 5,387 | |
7 | 1 | 7,0 | 6,350 | 5,917 | 5,773 |
0,75 | 7,0 | 6,513 | 6,188 | 6,080 | |
0,5 | 7,0 | 6,675 | 6,459 | 6,387 | |
8 | 1,25 | 8,0 | 7,188 | 6,647 | 6,466 |
1 | 8,0 | 7,350 | 6,917 | 6,773 | |
0,75 | 8,0 | 7,513 | 7,188 | 7,080 | |
0,5 | 8,0 | 7,675 | 7,459 | 7,387 | |
9 | 1,25 | 9,0 | 8,188 | 7,647 | 7,466 |
1 | 9,0 | 8,350 | 7,917 | 7,773 | |
0,75 | 9,0 | 8,513 | 8,188 | 8,080 | |
0,5 | 9,0 | 8,675 | 8,459 | 8,387 | |
10 | 1,5 | 10,0 | 9,026 | 8,376 | 8,160 |
1,25 | 10,0 | 9,188 | 8,647 | 8,466 | |
1 | 10,0 | 9,350 | 8,917 | 8,773 | |
0,75 | 10,0 | 9,513 | 9,188 | 9,080 | |
0,5 | 10,0 | 9,675 | 9,459 | 9,387 | |
11 | 1,5 | 11,0 | 10,026 | 9,376 | 9,160 |
1 | 11,0 | 10,350 | 9,917 | 9,773 | |
0,75 | 11,0 | 10,513 | 10,188 | 10,080 | |
0,5 | 11,0 | 10,675 | 10,459 | 10,387 | |
12 | 1,75 | 12,0 | 10,863 | 10,106 | 9,853 |
1,5 | 12,0 | 11,026 | 10,376 | 10,160 | |
1,25 | 12,0 | 11,188 | 10,647 | 10,466 | |
1 | 12,0 | 11,350 | 10,917 | 10,773 | |
0,75 | 12,0 | 11,513 | 11,188 | 11,080 | |
0,5 | 12,0 | 11,675 | 11,459 | 11,387 | |
14 | 2 | 14,0 | 12,701 | 11,835 | 11,546 |
1,5 | 14,0 | 13,026 | 12,376 | 12,160 | |
1,25 | 14,0 | 13,188 | 12,647 | 12,466 | |
1 | 14,0 | 13,350 | 12,917 | 12,773 | |
0,75 | 14,0 | 13,513 | 13,188 | 13,080 | |
0,5 | 14,0 | 13,675 | 13,459 | 13,387 | |
15 | 1,5 | 15,0 | 14,026 | 13,376 | 13,160 |
1 | 15,0 | 14,350 | 13,917 | 13,773 | |
16 | 2 | 16,0 | 14,701 | 13,835 | 13,546 |
1,5 | 16,0 | 15,026 | 14,376 | 14,160 | |
1 | 16,0 | 15,350 | 14,917 | 14,773 | |
0,75 | 16,0 | 15,513 | 15,188 | 15,080 | |
0,5 | 16,0 | 15,675 | 15,459 | 15,387 | |
17 | 1,5 | 17,0 | 16,026 | 15,376 | 15,160 |
1 | 17,0 | 16,350 | 15,917 | 15,773 | |
18 | 2,5 | 18,0 | 16,376 | 15,294 | 14,933 |
2 | 18,0 | 16,701 | 15,835 | 15,546 | |
1,5 | 18,0 | 17,026 | 16,376 | 16,160 | |
1 | 18,0 | 17,350 | 16,917 | 16,773 | |
0,75 | 18,0 | 17,518 | 17,188 | 17,080 | |
0,5 | 18,0 | 17,675 | 17,459 | 17,387 | |
20 | 2,5 | 20,0 | 18,376 | 17,294 | 16,933 |
2 | 20,0 | 18,701 | 17,835 | 17,546 | |
1,5 | 20,0 | 19,026 | 18,376 | 18,160 | |
1 | 20,0 | 19,350 | 18,917 | 18,773 | |
0,75 | 20,0 | 19,513 | 19,188 | 19,080 | |
0,5 | 20,0 | 19,675 | 19,459 | 19,387 | |
22 | 2,5 | 22,0 | 20,376 | 19,294 | 18,933 |
2 | 22,0 | 20,701 | 19,835 | 19,546 | |
1,5 | 22,0 | 21,026 | 20,376 | 20,160 | |
1 | 22,0 | 21,350 | 20,917 | 20,773 | |
0,75 | 22,0 | 21,513 | 21,188 | 21,080 | |
0,5 | 22,0 | 21,675 | 21,459 | 21,387 | |
24 | 3 | 24,0 | 22,051 | 20,752 | 20,319 |
2 | 24,0 | 22,701 | 21,835 | 21,546 | |
1,5 | 24,0 | 23,026 | 22,376 | 22,160 | |
1 | 24,0 | 23,350 | 22,917 | 22,773 | |
0,75 | 24,0 | 23,513 | 23,188 | 23,080 | |
25 | 2 | 25,0 | 23,701 | 22,835 | 22,546 |
1,5 | 25,0 | 24,026 | 23,376 | 23,160 | |
1 | 25,0 | 24,350 | 23,917 | 23,773 | |
26 | 1,5 | 26,0 | 25,026 | 24,376 | 24,160 |
27 | 3 | 27,0 | 25,051 | 23,752 | 23,319 |
2 | 27,0 | 25,701 | 24,835 | 24,546 | |
1,5 | 27,0 | 26,026 | 25,376 | 25,160 | |
1 | 27,0 | 26,350 | 25,917 | 25,773 | |
0,75 | 27,0 | 26,513 | 26,188 | 26,080 | |
28 | 2 | 28,0 | 26,701 | 25,835 | 25,546 |
1,5 | 28,0 | 27,026 | 26,376 | 26,160 | |
1 | 28,0 | 27,350 | 26,917 | 26,773 | |
30 | 3,5 | 30,0 | 27,727 | 26,211 | 25,706 |
3 | 30,0 | 28,051 | 26,752 | 26,319 | |
2 | 30,0 | 28,701 | 27,835 | 27,546 | |
1,5 | 30,0 | 29,026 | 28,376 | 28,160 | |
1 | 30,0 | 29,350 | 28,917 | 28,773 | |
0,75 | 30,0 | 29,513 | 29,188 | 29,080 | |
32 | 2 | 32,0 | 30,701 | 29,835 | 29,546 |
1,5 | 32,0 | 31,026 | 30,376 | 30,160 | |
33 | 3,5 | 33,0 | 30,727 | 29,211 | 28,706 |
3 | 33,0 | 31,051 | 29,752 | 29,319 | |
2 | 33,0 | 31,701 | 30,835 | 30,546 | |
1,5 | 33,0 | 32,026 | 31,376 | 31,160 | |
1 | 33,0 | 32,350 | 31,917 | 31,773 | |
0,75 | 33,0 | 32,513 | 32,188 | 32,080 | |
35 | 1,5 | 35,0 | 34,026 | 33,376 | 33,160 |
36 | 4 | 36,0 | 33,402 | 31,670 | 31,093 |
3 | 36,0 | 34,051 | 32,752 | 32,319 | |
2 | 36,0 | 34,701 | 33,835 | 33,546 | |
1,5 | 38,0 | 35,026 | 34,376 | 34,160 | |
1 | 36,0 | 35,350 | 34,917 | 34,773 | |
38 | 1,5 | 38,0 | 37,026 | 36,376 | 36,160 |
39 | 4 | 39,0 | 36,402 | 34,670 | 34,093 |
3 | 39,0 | 37,051 | 35,752 | 35,319 | |
2 | 39,0 | 37,701 | 36,835 | 36,546 | |
1,5 | 39,0 | 38,026 | 37,376 | 37,160 | |
1 | 39,0 | 38,350 | 37,917 | 37,773 | |
40 | 3 | 40,0 | 38,051 | 36,752 | 36,319 |
2 | 40,0 | 38,701 | 37,835 | 37,546 | |
1,5 | 40,0 | 39,026 | 38,376 | 38,160 | |
42 | 4,5 | 42,0 | 39,077 | 37,129 | 36,479 |
4 | 42,0 | 39,402 | 37,670 | 37,093 | |
3 | 42,0 | 40,051 | 38,752 | 38,319 | |
2 | 42,0 | 40,701 | 39,835 | 39,546 | |
42 | 1,5 | 42,0 | 41,026 | 40,376 | 40,160 |
1 | 42,0 | 41,350 | 40,917 | 40,773 | |
45 | 4,5 | 45,0 | 42,077 | 40,129 | 39,479 |
4 | 45,0 | 42,402 | 40,670 | 40,093 | |
3 | 45,0 | 43,051 | 41,752 | 41,319 | |
2 | 45,0 | 43,701 | 42,835 | 42,546 | |
1,5 | 45,0 | 44,026 | 43,376 | 43,160 | |
1 | 45,0 | 44,350 | 43,917 | 43,773 | |
48 | 5 | 48,0 | 44,752 | 42,587 | 41,866 |
4 | 48,0 | 45,402 | 43,670 | 43,093 | |
3 | 48,0 | 46,051 | 44,752 | 44,319 | |
2 | 48,0 | 46,701 | 45,835 | 45,516 | |
1,5 | 48,0 | 47,026 | 46,376 | 46,160 | |
1 | 48,0 | 47,350 | 46,917 | 46,773 | |
50 | 3 | 50,0 | 48,051 | 46,752 | 46,319 |
2 | 50,0 | 48,701 | 47,835 | 47,546 | |
1,5 | 50,0 | 49,026 | 48,376 | 48,160 | |
52 | 5 | 52,0 | 48,752 | 46,587 | 45,866 |
4 | 52,0 | 49,402 | 47,670 | 47,093 | |
3 | 52,0 | 50,051 | 48,752 | 48,319 | |
2 | 52,0 | 50,701 | 49,835 | 49,546 | |
1,5 | 52,0 | 51,026 | 50,376 | 50,160 | |
1 | 52,0 | 51,350 | 50,917 | 50,773 | |
55 | 4 | 55,0 | 52,402 | 50,670 | 50,093 |
3 | 55,0 | 53,051 | 51,752 | 51,319 | |
2 | 55,0 | 53,701 | 52,835 | 52,546 | |
1,5 | 55,0 | 54,026 | 53,376 | 53,160 | |
56 | 5,5 | 56,0 | 52,428 | 50,046 | 49,253 |
4 | 56,0 | 53,402 | 51,670 | 51,093 | |
3 | 56,0 | 54,051 | 52,752 | 52,319 | |
2 | 56,0 | 54,701 | 53,835 | 53,546 | |
1,5 | 56,0 | 55,026 | 54,376 | 54,160 | |
1 | 56,0 | 55,350 | 54,917 | 54,773 | |
58 | 4 | 58,0 | 55,402 | 53,670 | 53,093 |
3 | 58,0 | 56,051 | 54,752 | 54,319 | |
2 | 58,0 | 56,701 | 55,835 | 55,546 | |
1,5 | 58,0 | 57,026 | 56,376 | 56,160 | |
60 | 5,5 | 60,0 | 56,428 | 54,046 | 53,252 |
4 | 60,0 | 57,402 | 55,670 | 55,093 | |
3 | 60,0 | 58,051 | 56,752 | 56,319 | |
2 | 60,0 | 58,701 | 57,835 | 57,546 | |
1,5 | 60,0 | 59,026 | 58,376 | 58,160 | |
1 | 60,0 | 59,350 | 58,917 | 58,773 | |
62 | 4 | 62,0 | 59,402 | 57,670 | 57,093 |
3 | 62,0 | 60,051 | 58,752 | 58,319 | |
2 | 62,0 | 60,701 | 59,835 | 59,546 | |
1,5 | 62,0 | 61,026 | 60,376 | 60,160 | |
64 | 6 | 64,0 | 60,103 | 57,505 | 56,639 |
4 | 64,0 | 61,402 | 59,670 | 59,093 | |
3 | 64,0 | 62,051 | 60,752 | 60,319 | |
2 | 64,0 | 62,701 | 61,835 | 61,546 | |
1,5 | 64,0 | 63,026 | 62,376 | 62,160 | |
1 | 64,0 | 63,350 | 62,917 | 62,773 | |
65 | 4 | 65,0 | 62,402 | 60,670 | 60,093 |
3 | 65,0 | 63,051 | 61,752 | 61,319 | |
2 | 65,0 | 63,701 | 62,835 | 62,546 | |
1,5 | 65,0 | 64,026 | 63,376 | 63,160 | |
68 | 6 | 68,0 | 64,103 | 61,505 | 60,639 |
4 | 68,0 | 64,402 | 63,670 | 63,093 | |
3 | 68,0 | 66,051 | 64,752 | 64,319 | |
2 | 68,0 | 66,701 | 65,835 | 65,546 | |
1,5 | 68,0 | 67,026 | 66,376 | 66,160 | |
1 | 68,0 | 67,350 | 66,917 | 66,773 | |
70 | 6 | 70,0 | 66,103 | 63,505 | 62,639 |
4 | 70,0 | 67,402 | 65,670 | 65,093 | |
3 | 70,0 | 68,051 | 66,752 | 66,319 | |
2 | 70,0 | 68,701 | 67,835 | 67,546 | |
1,5 | 70,0 | 69,026 | 68,376 | 68,160 | |
72 | 6 | 72,0 | 68,103 | 65,505 | 64,639 |
4 | 72,0 | 69,402 | 67,670 | 67,093 | |
3 | 72,0 | 70,051 | 68,752 | 68,319 | |
2 | 72,0 | 70,701 | 69,835 | 69,546 | |
1,5 | 72,0 | 71,026 | 70,376 | 70,160 | |
1 | 72,0 | 71,350 | 70,917 | 70,773 | |
75 | 4 | 75,0 | 72,402 | 70,670 | 70,093 |
3 | 75,0 | 73,051 | 71,752 | 71,319 | |
2 | 75,0 | 73,701 | 72,835 | 72,546 | |
1,5 | 75,0 | 74,026 | 73,376 | 73,160 | |
76 | 6 | 76,0 | 72,103 | 69,505 | 68,639 |
4 | 76,0 | 73,402 | 71,670 | 71,093 | |
3 | 76,0 | 74,051 | 72,752 | 72,319 | |
2 | 76,0 | 74,701 | 73,835 | 73,546 | |
1,5 | 76,0 | 75,026 | 74,376 | 74,160 | |
1 | 76,0 | 75,350 | 74,917 | 74,773 | |
78 | 2 | 78,0 | 76,701 | 75,835 | 75,546 |
80 | 6 | 80,0 | 76,103 | 73,505 | 72,639 |
4 | 80,0 | 77,402 | 75,670 | 75,093 | |
3 | 80,0 | 78,051 | 76,752 | 76,319 | |
2 | 80,0 | 78,701 | 77,835 | 77,546 | |
1,5 | 80,0 | 79,026 | 78,376 | 78,160 | |
1 | 80,0 | 79,350 | 78,917 | 78,773 | |
82 | 2 | 82,0 | 80,701 | 79,835 | 79,546 |
85 | 6 | 85,0 | 81,103 | 78,505 | 77,639 |
4 | 85,0 | 82,402 | 80,670 | 80,093 | |
3 | 85,0 | 83,051 | 81,752 | 81,319 | |
2 | 85,0 | 83,701 | 82,835 | 82,546 | |
1,5 | 85,0 | 84,026 | 83,376 | 83,160 | |
90 | 6 | 90,0 | 86,103 | 83,505 | 82,639 |
4 | 90,0 | 87,402 | 85,670 | 85,093 | |
3 | 90,0 | 88,051 | 86,752 | 86,319 | |
2 | 90,0 | 88,701 | 87,835 | 87,546 | |
1,5 | 90,0 | 89,026 | 88,376 | 88,160 | |
95 | 6 | 95,0 | 91,103 | 88,505 | 87,639 |
4 | 95,0 | 92,402 | 90,670 | 90,093 | |
3 | 95,0 | 93,051 | 91,752 | 91,319 | |
2 | 95,0 | 93,701 | 92,835 | 92,546 | |
1,5 | 95,0 | 94,026 | 93,376 | 93,160 | |
10 | 6 | 100,0 | 96,103 | 93,505 | 92,639 |
4 | 100,0 | 97,402 | 95,670 | 95,093 | |
3 | 100,0 | 98,051 | 96,752 | 96,319 | |
2 | 100,0 | 98,701 | 97,835 | 97,546 | |
1,5 | 100,0 | 99,026 | 98,376 | 98,160 | |
105 | 6 | 105,0 | 101,103 | 98,505 | 97,639 |
4 | 105,0 | 102,402 | 100,670 | 100,093 | |
3 | 105,0 | 103,051 | 101,752 | 101,319 | |
2 | 105,0 | 103,701 | 102,835 | 102,546 | |
1,5 | 105,0 | 104,026 | 103,376 | 103,160 | |
110 | 6 | 110,0 | 106,103 | 103,505 | 102,639 |
4 | 110,0 | 107,402 | 105,670 | 105,093 | |
3 | 110,0 | 108,051 | 106,752 | 106,319 | |
2 | 110,0 | 108,701 | 107,835 | 107,546 | |
1,5 | 110,0 | 109,026 | 108,376 | 108,160 | |
115 | 6 | 115,0 | 111,103 | 108,505 | 107,639 |
4 | 115,0 | 112,402 | 110,670 | 110,093 | |
3 | 115,0 | 113,051 | 111,752 | 111,319 | |
2 | 115,0 | 113,701 | 112,835 | 112,546 | |
1,5 | 115,0 | 114,026 | 113,376 | 113,160 | |
120 | 6 | 120,0 | 116,103 | 113,505 | 112,639 |
4 | 120,0 | 117,402 | 115,670 | 115,093 | |
3 | 120,0 | 118,051 | 116,752 | 116,319 | |
2 | 120,0 | 118,701 | 117,835 | 117,546 | |
1,5 | 120,0 | 119,026 | 118,376 | 118,160 | |
125 | 8 | 125,0 | 119,804 | 116,340 | 115,185 |
6 | 125,0 | 121,103 | 118,505 | 117,639 | |
4 | 125,0 | 122,402 | 120,670 | 120,093 | |
8 | 125,0 | 123,051 | 121,752 | 121,319 | |
2 | 125,0 | 123,701 | 122,835 | 122,546 | |
1,5 | 125,0 | 124,026 | 123,376 | 123,160 | |
130 | 8 | 130,0 | 124,804 | 121,340 | 120,185 |
6 | 130,0 | 126,103 | 123,505 | 122,639 | |
4 | 130,0 | 127,402 | 125,670 | 125,093 | |
3 | 130,0 | 128,051 | 126,752 | 126,319 | |
2 | 130,0 | 128,701 | 127,835 | 127,546 | |
1,5 | 130,0 | 129,026 | 128,376 | 128,160 | |
135 | 6 | 135,0 | 131,103 | 128,505 | 127,639 |
4 | 135,0 | 132,402 | 130,670 | 130,093 | |
3 | 135,0 | 133,051 | 131,752 | 131,319 | |
2 | 135,0 | 133,701 | 132,835 | 132,546 | |
1,5 | 135,0 | 134,026 | 133,376 | 133,160 | |
140 | 8 | 140,0 | 134,804 | 131,340 | 130,185 |
6 | 140,0 | 136,103 | 133,505 | 132,639 | |
4 | 140,0 | 537,402 | 135,670 | 135,093 | |
3 | 140,0 | 138,051 | 136,752 | 136,319 | |
2 | 140,0 | 138,701 | 137,835 | 137,546 | |
1,5 | 140,0 | 139,026 | 138,376 | 138,160 | |
145 | 6 | 145,0 | 141,103 | 138,505 | 137,639 |
4 | 145,0 | 142,402 | 140,670 | 140,093 | |
3 | 145,0 | 143,051 | 141,752 | 141,319 | |
2 | 145,0 | 143,701 | 142,835 | 142,546 | |
1,5 | 145,0 | 144,025 | 143,376 | 143,160 | |
150 | 8 | 150,0 | 144,804 | 141,340 | 140,185 |
6 | 150,0 | 146,103 | 143,505 | 142,639 | |
4 | 150,0 | 147,402 | 145,670 | 145,093 | |
3 | 150,0 | 148,051 | 146,752 | !46,319 | |
2 | 150,0 | 148,701 | 147,835 | 147,546 | |
1,5 | 150,0 | 149,026 | 148,376 | 148,160 | |
155 | 6 | 155,0 | 151,103 | 148,505 | 147,639 |
4 | 155,0 | 152,402 | 150,670 | 150,093 | |
3 | 155,0 | 153,051 | 151,752 | 151,319 | |
2 | 155,0 | 153,701 | 152,835 | 152,546 | |
160 | 8 | 160,0 | 154,804 | 151,340 | 150,185 |
6 | 160,0 | 156,103 | 153,505 | 152,639 | |
4 | 160,0 | 157,402 | 155,670 | 155,093 | |
3 | 160,0 | 158,051 | 156,752 | 156,319 | |
2 | 160,0 | 158,701 | 157,835 | 157,546 | |
165 | 6 | 165,0 | 161,103 | 158,505 | 157,639 |
4 | 165,0 | 162,402 | 160,670 | 160,093 | |
3 | 165,0 | 163,051 | 161,752 | 161,319 | |
2 | 165,0 | 163,701 | 162,835 | 162,546 | |
170 | 8 | 170,0 | 164,804 | 161,340 | 160,185 |
6 | 170,0 | 166,103 | 163,505 | 162,639 | |
4 | 170,0 | 167,402 | 165,670 | 165,093 | |
3 | 170,0 | 168,051 | 166,752 | 166,319 | |
2 | 170,0 | 168,701 | 167,835 | 167,546 | |
175 | 6 | 175,0 | 171,103 | 168,505 | 167,639 |
4 | 175,0 | 172,402 | 170,670 | 170,093 | |
3 | 175,0 | 173,051 | 171,752 | 171,319 | |
2 | 175,0 | 173,701 | 172,835 | 172,546 | |
180 | 8 | 180,0 | 174,804 | 171,340 | 170,185 |
6 | 180,0 | 176,103 | 173,505 | 172,639 | |
4 | 180,0 | 177,402 | 175,670 | 175,093 | |
3 | 180,0 | 178,051 | 176,752 | 176,319 | |
2 | 180,0 | 178,701 | 177,835 | 177,546 | |
185 | 6 | 185,0 | 181,103 | 178,605 | 177,639 |
4 | 185,0 | 182,402 | 180,670 | 180,093 | |
3 | 185,0 | 183,051 | 181,752 | 181,319 | |
2 | 185,0 | 183,701 | 182,835 | 182,546 | |
190 | 8 | 190,0 | 184,804 | 181,340 | 180,185 |
6 | 190,0 | 186,103 | 183,505 | 182,639 | |
4 | 190,0 | 187,402 | 185,670 | 185,093 | |
3 | 190,0 | 188,051 | 186,752 | 186,319 | |
2 | 190,0 | 188,701 | 187,835 | 187,546 | |
195 | 6 | 195,0 | 191,103 | 188,505 | 187,639 |
4 | 195,0 | 192,402 | 190,670 | 190,093 | |
3 | 195,0 | 193,051 | 191,752 | 191,319 | |
2 | 195,0 | 193,701 | 192,835 | 192,546 | |
200 | 8 | 200,0 | 194,804 | 191,340 | 190,185 |
6 | 200,0 | 196,103 | 193,505 | 192,639 | |
4 | 200,0 | 197,402 | 195,670 | 195,093 | |
3 | 200,0 | 198,051 | 196,752 | 196,319 | |
2 | 200,0 | 198,701 | 197,835 | 197,546 | |
205 | 6 | 205,0 | 201,103 | 198,505 | 197,639 |
4 | 205,0 | 202,402 | 20,670 | 200,093 | |
3 | 205,0 | 203,051 | 201,752 | 201,319 | |
210 | 8 | 210,0 | 204,804 | 201,340 | 200,185 |
6 | 210,0 | 206,103 | 203,505 | 202,639 | |
4 | 210,0 | 207,402 | 205,670 | 205,093 | |
3 | 210,0 | 208,051 | 206,752 | 206,319 | |
215 | 6 | 215,0 | 211,103 | 208,505 | 2,07,639 |
4 | 215,0 | 212,402 | 210,670 | 210,093 | |
3 | 215,0 | 213,051 | 211,752 | 211,319 | |
220 | 8 | 220,0 | 214,804 | 211,340 | 210,185 |
6 | 220,0 | 216,103 | 213,505 | 212,639 | |
4 | 220,0 | 217,402 | 215,670 | 215,093 | |
3 | 220,0 | 218,051 | 216,752 | 216,319 | |
225 | 6 | 225,0 | 221,103 | 218,505 | 217,639 |
4 | 225,0 | 222,402 | 220,670 | 220,093 | |
3 | 225,0 | 223,051 | 221,752 | 221,319 | |
230 | 8 | 230,0 | 224,804 | 221,340 | 220,185 |
6 | 230,0 | 226,103 | 223,505 | 222,639 | |
4 | 230,0 | 227,402 | 225,670 | 225,098 | |
3 | 230,0 | 228,051 | 226,752 | 226,319 | |
235 | 6 | 235,0 | 231,103 | 228,505 | 227,639 |
4 | 235,0 | 232,402 | 230,670 | 230,093 | |
3 | 235,0 | 233,051 | 231,752 | 231,319 | |
240 | 8 | 240,0 | 234,804 | 231,340 | 230,185 |
6 | 240,0 | 236,103 | 233,505 | 232,639 | |
4 | 240,0 | 237,402 | 235,670 | 235,093 | |
3 | 240,0 | 238,051 | 236,752 | 236,319 | |
245 | 6 | 245,0 | 241,103 | 238,505 | 237,639 |
4 | 245,0 | 242,402 | 240,670 | 240,093 | |
3 | 245,0 | 243,051 | 241,752 | 241,319 | |
250 | 8 | 250,0 | 244,804 | 241,340 | 240,185 |
6 | 250,0 | 246,103 | 243,505 | 242,639 | |
4 | 250,0 | 247,402 | 245,670 | 245,093 | |
3 | 250,0 | 248,051 | 246,752 | 246,319 | |
255 | 6 | 255,0 | 21,103 | 248,505 | 247,639 |
4 | 255,0 | 252,402 | 250,670 | 250,093 | |
3 | 255,0 | 253,051 | 251,752 | 251,319 | |
260 | 8 | 260,0 | 254,804 | 251,340 | 250,185 |
6 | 260,0 | 256,103 | 253,505 | 252,639 | |
4 | 260,0 | 257,402 | 255,670 | 255,093 | |
3 | 260,0 | 258,051 | 256,752 | 256,319 | |
265 | 6 | 265,0 | 261,103 | 258,505 | 257,639 |
4 | 265,0 | 262,402 | 260,670 | 260,093 | |
3 | 265,0 | 263,051 | 261,752 | 261,319 | |
270 | 8 | 270,0 | 264,804 | 261,340 | 260,185 |
6 | 270,0 | 266,103 | 263,505 | 262,639 | |
4 | 270,0 | 267,402 | 265,670 | 265,093 | |
3 | 270,0 | 268,051 | 266,752 | 266,319 | |
275 | 6 | 275,0 | 271,103 | 268,505 | 267,639 |
4 | 275,0 | 272,402 | 270,670 | 270,093 | |
3 | 275,0 | 273,051 | 271,752 | 271,319 | |
280 | 8 | 280,0 | 274,804 | 271,340 | 270,185 |
6 | 280,0 | 276,103 | 273,505 | 272,639 | |
4 | 280,0 | 277,402 | 275,670 | 275,093 | |
3 | 280,0 | 278,051 | 276,752 | 276,319 | |
285 | 6 | 285,0 | 281,103 | 278,505 | 277,639 |
4 | 285,0 | 282,402 | 280,670 | 280,093 | |
3 | 285,0 | 283,051 | 281,752 | 281,319 | |
290 | 8 | 290,0 | 284,804 | 281,340 | 280,185 |
6 | 290,0 | 286,103 | 283,505 | 282,639 | |
4 | 290,0 | 287,402 | 285,670 | 285,093 | |
3 | 290,0 | 288,051 | 286,752 | 286,319 | |
295 | 6 | 295,0 | 291,103 | 288,505 | 287,639 |
4 | 295,0 | 292,402 | 290,670 | 290,093 | |
3 | 295,0 | 293,051 | 291,752 | 291,319 | |
300 | 8 | 300,0 | 294,804 | 291,340 | 290,185 |
6 | 300,0 | 296,103 | 293,505 | 292,639 | |
4 | 300,0 | 297,402 | 295,670 | 295,093 | |
3 | 300,0 | 298,051 | 296,752 | 296,319 | |
310 | 6 | 310,0 | 306,103 | 303,505 | 302,639 |
4 | 310,0 | 307,402 | 305,670 | 305,093 | |
320 | 8 | 320,0 | 314,804 | 311,340 | 310,185 |
6 | 320,0 | 3!6,103 | 313,505 | 312,639 | |
4 | 320,0 | 317,402 | 315,670 | 315,093 | |
330 | 6 | 330,0 | 326,103 | 323,505 | 322,639 |
4 | 330,0 | 327,402 | 325,670 | 325,093 | |
340 | 8 | 340,0 | 334,804 | 331,340 | 330,185 |
6 | 340,0 | 336,103 | 333,505 | 332,639 | |
4 | 340,0 | 337,402 | 335,670 | 335,093 | |
350 | 6 | 350,0 | 346,103 | 343,505 | 342,639 |
4 | 350,0 | 347,402 | 345,670 | 345,093 | |
360 | 8 | 360,0 | 354,804 | 351,340 | 350,185 |
6 | 360,0 | 356,103 | 353,505 | 352,639 | |
4 | 360,0 | 357,402 | 355,670 | 355,093 | |
370 | 6 | 370,0 | 366,103 | 363,505 | 362,639 |
4 | 370,0 | 367,402 | 365,670 | 365,093 | |
380 | 8 | 380,0 | 374,804 | 371,340 | 370,185 |
6 | 380,0 | 376,103 | 373,505 | 372,639 | |
4 | 380,0 | 377,402 | 375,670 | 375,093 | |
390 | 6 | 390,0 | 386,103 | 383,505 | 382,639 |
4 | 390,0 | 387,402 | 385,670 | 385,093 | |
400 | 8 | 400,0 | 394,804 | 391,340 | 390,185 |
6 | 400,0 | 396,103 | 393,505 | 392,639 | |
4 | 400,0 | 397,402 | 395,670 | 395,093 | |
410 | 6 | 410,0 | 406,103 | 403,505 | 402,639 |
420 | 8 | 420,0 | 414,804 | 411,340 | 410,185 |
6 | 420,0 | 416,103 | 413,505 | 412,639 | |
430 | 6 | 430,0 | 426,103 | 423,505 | 422,639 |
440 | 8 | 440,0 | 434,804 | 431,340 | 430,185 |
6 | 440,0 | 436,103 | 433,505 | 432,639 | |
450 | 6 | 450,0 | 446,103 | 443,505 | 442,639 |
460 | 8 | 460,0 | 454,804 | 451,340 | 450,185 |
6 | 460,0 | 456,103 | 453,505 | 452,639 | |
470 | 6 | 470,0 | 466,103 | 463,505 | 462,639 |
480 | 8 | 480,0 | 474,804 | 471,340 | 470,185 |
6 | 480,0 | 476,103 | 473,505 | 472,639 | |
490 | 6 | 490,0 | 486,103 | 483,505 | 482,639 |
500 | 8 | 500,0 | 494,804 | 491,340 | 490,185 |
6 | 500,0 | 496,103 | 493,505 | 492,639 | |
510 | 6 | 510,0 | 506,103 | 503,505 | 502,639 |
520 | 8 | 520,0 | 514,804 | 511,340 | 510,185 |
6 | 520,0 | 516,103 | 513,505 | 512,639 | |
530 | 6 | 530,0 | 526,103 | 523,505 | 522,639 |
540 | 8 | 540,0 | 534,804 | 531,340 | 530,185 |
6 | 540,0 | 536,103 | 533,505 | 532,639 | |
550 | 6 | 550,0 | 546,103 | 543,505 | 542,639 |
560 | 8 | 560,0 | 554,804 | 551,340 | 550,185 |
6 | 560,0 | 556,103 | 553,505 | 552,639 | |
570 | 6 | 570,0 | 566,103 | 563,505 | 562,639 |
580 | 8 | 580,0 | 574,804 | 571,340 | 570,185 |
6 | 580,0 | 576,103 | 573,505 | 572,639 | |
590 | 6 | 590,0 | 586,103 | 583,505 | 582,639 |
600 | 8 | 600,0 | 594,804 | 591,340 | 590,185 |
6 | 600,0 | 596,103 | 593,505 | 592,639 |
Что мы знаем о метрической резьбе? Казимир Кашкур
Главная » Техподдержка » Статьи » Что мы знаем о метрической резьбе? Казимир КашкурРезьба – она подобна колесу, и сопровождает нас на каждом шагу.
Резьба бывает разная: художественная, где рисунок вырезается на материале, или машиностроительная, которая представляет собой спиральную винтовую нарезку, выполненную на круглом стержне, либо в отверстии.
Об одной такой резьбе из множества их разновидностей, применяемых в машиностроении и быту, будет повествовать данная статья.
Резьба – она подобна колесу, и сопровождает нас на каждом шагу. Куда бы мы ни устремили свой взгляд, нас окружают резьбы. Они есть в мебели, замках, дверях, кухонных комбайнах, в некоторой посуде, в ванной комнате, в туалете, в любом светильнике, и так далее…
Резьбы бывают: правые, левые, треугольные, круглые, трапециодальные, трапециодальные упорные, прямоугольные, ленточные, трубные цилиндрические, трубные конические, модульные, питчевые. В быту нас окружают множество разновидностей резьб: ленточные – на саморезах, круглые – на цоколях лампочек, трапециодальные – в силовых механизмах, треугольные – буквально везде, начиная от кухни и заканчивая автомобилем, в котором их десятки типоразмеров.
Наиболее распространенной крепежной резьбой в быту является резьба метрическая, имеющая треугольный профиль.
Такая резьба имеет угол профиля шестьдесят градусов. Единица измерения параметров резьбы – миллиметр. Обозначение такой резьбы состоит из буквы «М» и цифр. Например, М10 означает – резьба метрическая с диаметром стержня резьбы, равного 10 мм.
Если к такому обозначению добавлен знак «х» с цифрой, то следующей за знаком «х» цифрой обозначен шаг резьбы. Например, М10 х 1 означает – резьба метрическая диаметром 10 мм, имеющая шаг резьбы 1 мм. Крупные шаги не обозначают – они являются основными. Шаг резьбы измеряется расстоянием между вершинами двух соседних витков. Для измерения шага применяют специальные шаблоны, называемые резьбомерами.
В быту под рукой может не оказаться резьбомера. В таких случаях можно замерить шаг резьбы с помощью штангенциркуля, или, в худшем случае, линейки. Измерение шага лучше производить на резьбе болта, нежели гайки. Это связано с открытостью резьбы и возможностью прямого визуального контроля при проведении измерений. Для измерения надо отсчитать наибольшее число ниток и измерить расстояние между крайними вершинами витков резьбы по прямой линии. Я предпочитаю числа: 3, 5, 10. Связано это с простотой вычислений. Например, было замерено расстояние между десятью витками резьбы диаметра 16 мм, которое составило 20 мм. Чтобы узнать шаг резьбы, надо 20 мм разделить на 10 витков. Получим шаг резьбы, равный 2 мм.
Для чего нужно знать шаг резьбы? Естественно, для правильности выбора резьбонарезного инструмента или же сверла для сверления отверстия под резьбу.
Определение диаметра стержня производится проще, чем определеление диаметра отверстия под нарезание резьбы. Диаметр стержня обычно равен диаметру резьбы. Однако, поскольку при нарезании резьбы происходит вытягивание металла (увеличение первоначального диаметра при нарезке резьбы), то обычно диаметр стержня занижают от номинального значения на 1:5; 1:8 шага резьбы. Например, для нарезания резьбы М16 с шагом равным 2 мм предпочтительно, чтобы диаметр стержня находился в пределах: от 16-2:5=15,6 мм до 16-2:8=15,8 мм.
Как узнать диаметр отверстия под нарезаемую метрическую резьбу, если под рукой нет машиностроительного справочника с таблицами типоразмеров резьбы и рекомендуемыми диаметрами отверстий?
В таком случае воспользуемся приобретенными навыками измерения шага будущей резьбы и вычислим диаметр отверстия под нарезание резьбы метчиком.
Итак, шаг резьбы мы замерили и вычислили – он равен 2 мм. Диаметр резьбы мы замерили ранее и знаем, что он равен 16 мм. Для определения диаметра отверстия достаточно от диаметра резьбы болта 16 мм вычесть шаг резьбы 2 мм. Результат вычитания будет равен 14 мм. Значит, диаметр отверстия под нарезание резьбы М16 с шагом 2 мм должен быть равен 14 мм.
Вот такая она – резьба метрическая. Естественно, о ней можно рассказать намного больше, чем рассказано в данной статье.
Надеюсь, что эти сведения окажутся полезными людям, которые хотят освоить простейшие виды ремонта, иногда так необходимые в быту.
Казимир Кашкур
Полезная таблица — диаметр резьбы и шаг. — Bezhelme.ru
Многие из вас сталкивались с нарезанием внутренней резьбы с помощью метчика и у многих возникал вопрос — какого диаметра должно быть сверло под резьбу, к примеру М8 или М10. Ведь при нарезке резьбы первоначальной задачей становится сверление отверстия подходящего диаметра, чтобы метчик резал металл не слишком туго и в то же время не болтался. Поэтому расскажу, как можно самому высчитать правильный диаметр сверла под любую метрическую резьбу.
На самом деле все просто, как вы знаете, параметров резьбы всего 2: это диаметр и шаг. Еще можно заметить(для тех кто не знает), что резьба бывает стандартная(со стандартным шагом) и любая другая. К примеру, стандартная резьба для 10 мм — это 1.5мм, то есть М10*1.5. Но ведь встречается довольно часто резьба 10*1.25 и 10*1. Буква М на резьбе означает, что резьба метрическая. А бывает еще трубная(читать про трубные плашки). Ну а в этой статье мы разберем все нюансы нарезания метрической резьбы и конечно же узнаем, как вычислить диаметр сверла под резьбу.
Значит, как я уже говорил, в основу расчетов берем диаметр и шаг. Просто вычитаем из диаметра шаг резьбы и полученная цифра будет диаметром требуемого сверла. Давайте посчитаем диаметр сверла под резьбу М8(стандартная).
8 минус 1.25(стандартный шаг) получаем 6.75 мм — именно такое сверло нужно, чтобы нарезать резьбу М8. А например, резьба 8*1 — сверло получится диаметром 7 мм. Надеюсь, все понятно. Также предоставлю вам нужную табличку стандартных резьб(то есть вы сможете узнать, какой шаг стандартный у определенного диаметра) и диаметр сверл для них.
Таблица стандартной резьбы и диаметр сверла для них.
диаметр резьбы | шаг резьбы | сверло под резьбу |
М2 | 0.45 | 1.5 мм |
М3 | 0.5 | 2.5 мм |
М4 | 0.7 | 3.3 мм |
М5 | 0.8 | 4.2 мм |
М6 | 1 | 5 мм |
М7 | 1 | 6 мм |
М8 | 1.25 | 6.7-6.8 |
М9 | 1.25 | 7.7-7.8 |
М10 | 1.5 | 8.5 |
М11 | 1.5 | 9.5 |
М12 | 1.75 | 10.2-10.3 |
М14 | 2 | 12 мм |
М16 | 2 | 14 мм |
М18 | 2.5 | 15.5 |
М20 | 2.5 | 17.5 |
М22 | 2.5 | 19.5 |
М24 | 3 | 21 |
М27 | 3 | 24 мм |
М30 | 3.5 | 26.5 |
М33 | 3.5 | 29.5 |
М36 | 4 | 32 мм |
Помимо стандартной резьбы встречаются шаги 0.75(для мелких резьб до М10), 1 мм, 1.25 мм, 2 мм(у крупных метчиков и плашек).
Надеюсь, данная статья помогла вам самостоятельно рассчитать требуемый диаметр сверла под нарезаемую резьбу. Кстати, резьбу нарезайте не «на сухую», а подливайте машинного или бытового масла. Это снизит нагрузку на метчик-плашку, да и резать так гораздо легче.
Определение темы по Merriam-Webster
\ ˈThred \1а : нить, группа нитей, скрученных вместе, или отрезок нити, образованный путем прядения и скручивания коротких текстильных волокон в непрерывную прядь.
б : кусок резьбы
2а : любые из различных натуральных волокон. нити паутины
б : узкий ручей (как вода)
c : выступающее спиральное ребро (как в фитинге или на трубе), с помощью которого части могут быть соединены между собой : винтовая резьба3 : что-то непрерывное или продолжительное: например,
а : цепочка рассуждений или цепочка мыслей, которая связывает части в последовательности (идей или событий). потерял нить истории
б : продолжающийся элемент нить меланхолии отмечена всем его письмом
c : серия электронных сообщений (например, на доске объявлений или на веб-сайте социальных сетей) по одной теме или в ответ на одно сообщение.4 : слабая или слабая опора висит на волоске
резьбовой; заправка; потоки
переходный глагол
1а : , чтобы пропустить нить через ушко (иглы)
б : для размещения нити, пряжи или вводной детали в рабочем положении для использования в (машине)
2а (1) : для передачи чего-либо в виде нити продеть трубу проволокой
(2) : для передачи (чего-либо, например ленты, линии или пленки) внутрь или через что-либо воткнул в камеру новый рулон пленки
б : пробиваться через или между пробираясь по узким улочкам также : , чтобы обычно осторожно пробираться через опасную ситуацию.
3 : для соединения или как на нити : строка нитки бусины5 : для формирования винтовой резьбы на или в
Что такое поток в ОС и в чем разница между процессом и потоком?
Что такое поток в ОС и в чем разница между процессом и потоком?
Читая этот блог, вы можете слушать музыку или заниматься другой работой.Другими словами, вы можете выполнять разные задачи параллельно. Точно так же в компьютере для параллельного выполнения процессов используется потоков и . В компьютерной или мобильной игре, когда вы видите такие объекты, как автомобили, грузовики и т. Д., Это просто потоки, которые выполняются в игровом приложении. Рассмотрим другой пример, когда в веб-браузере может быть поток для отображения изображений или видео, в то время как другие потоки могут получать данные из Интернета. Таким образом, одному приложению может потребоваться параллельное выполнение нескольких аналогичных задач.Поток используется для улучшения приложения за счет параллелизма. Итак, приступим и узнаем больше о потоках.
Поток
Поток – это исполнительный блок, который имеет собственный счетчик программ, стек и набор регистров, которые находятся в процессе. Потоки не могут существовать вне какого-либо процесса. Кроме того, каждый поток принадлежит ровно одному процессу. Информация, такая как сегмент кода, файлы и сегмент данных, может совместно использоваться разными потоками.
Потоки обычно используются для улучшения приложения за счет параллелизма .Фактически, только один поток одновременно выполняется ЦП, но ЦП быстро переключает между потоками, чтобы создать иллюзию, что потоки работают параллельно.
Потоки также известны как облегченные процессы.
На схеме выше показаны однопоточный и многопоточный процессы. Однопоточный процесс – это однопоточный процесс. Многопоточный процесс – это многопоточный процесс.Как ясно показывает диаграмма, у нескольких потоков в нем есть свои собственные регистры, стек и счетчик, но они разделяют код и сегмент данных.
Типы потоков
Потоки пользовательского уровня
- Потоки пользовательского уровня управляются пользователями, и ядро не знает об этом.
- Эти потоки быстрее создавать и управлять ими.
- Ядро управляет ими, как если бы это был однопоточный процесс.
- Реализуется с использованием библиотек пользовательского уровня, а не с помощью системных вызовов.Таким образом, при переключении контекста потоком операционная система не обращается.
- Каждый процесс имеет свою собственную таблицу частных потоков, чтобы отслеживать потоки.
Поток уровня ядра
- Ядро знает о потоке и поддерживается ОС.
- Потоки создаются и реализуются с помощью системных вызовов.
- Таблица потоков здесь отсутствует для каждого процесса. В ядре есть таблица потоков, чтобы отслеживать все потоки, присутствующие в системе.
- Потоки уровня ядра создаются и управляются медленнее, чем потоки уровня пользователя.
Преимущества потоков
- Производительность: Потоки улучшают общую производительность (пропускную способность, скорость вычислений, отзывчивость) программы.
- Совместное использование ресурсов: Поскольку потоки могут совместно использовать память и ресурсы любого процесса, это позволяет любому приложению выполнять несколько действий внутри одного и того же адресного пространства.
- Использование многопроцессорной архитектуры: Различные потоки могут выполняться параллельно на нескольких процессорах, следовательно, это позволяет использовать процессор в большой степени и повысить эффективность.
- Сокращенное время переключения контекста: Потоки минимизируют время переключения контекста, как и при переключении потоков, пространство виртуальной памяти остается прежним.
- Параллелизм: Поток обеспечивает параллелизм внутри процесса.
- Параллелизм: Методы параллельного программирования легче реализовать.
Разница между процессом и потоком
- Определение: Процесс означает программу, которая в настоящее время выполняется, тогда как поток – это объект, который находится в процессе, который может быть запланирован для выполнения.
- Время завершения: Процессам требуется больше времени для завершения, тогда как потокам требуется меньше времени для завершения.
- Время создания: Время создания процесса занимает больше времени по сравнению со временем создания потока.
- Время переключения контекста: Переключение контекста процесса занимает больше времени по сравнению с переключением контекста потока.
- Связь: Связь между потоками требует меньше времени по сравнению с обменом данными между процессами.
- Ресурсы: Процессы также называются тяжеловесными, поскольку они используют больше ресурсов. Потоки называются легковесными процессами, поскольку они совместно используют ресурсы.
- Память: Процесс запускается в отдельном пространстве памяти, тогда как потоки выполняются в общем пространстве памяти.
- Совместное использование данных: Различные процессы имеют разные копии данных, файлов и кодов, тогда как потоки используют одну и ту же копию данных, файлов и сегментов кода.
- Пример: Открытие нового браузера (например, Chrome и т. Д.) Является примером создания процесса.На этом этапе начнется выполнение нового процесса. Напротив, открытие нескольких вкладок в браузере – это пример создания цепочки.
Вот и все. Подробнее о многопоточности и ее моделях мы узнаем в следующем блоге. Надеюсь, вам понравился этот блог.
Поделитесь этим блогом с друзьями, чтобы распространять знания. Посетите наш канал YouTube, чтобы узнать больше.
Продолжайте учиться 🙂
Команда AfterAcademy!
Поток в Java – что это такое и почему он используется
Что такое поток Java и почему он используется?
Поток в контексте Java – это путь, по которому выполняется программа.Все программы Java имеют по крайней мере один поток, известный как основной поток, который создается виртуальной машиной Java (JVM) при запуске программы, когда метод main () вызывается с основным потоком.
В Java создание потока осуществляется путем реализации интерфейса и расширения класса. Каждый поток Java создается и управляется классом java.lang.Thread .
Однопотоковое приложение имеет только один поток и может одновременно обрабатывать только одну задачу.Для параллельной обработки нескольких задач используется многопоточность: создается несколько потоков, каждый из которых выполняет свою задачу.
Большинство коммерческих приложений широко используют многопоточность. Это делается по нескольким причинам:
- Для более быстрой обработки фоновых / пакетных задач: Когда несколько задач должны выполняться одновременно, многопоточность позволяет различным задачам выполняться параллельно. В результате сокращается общее время обработки.
- Чтобы воспользоваться преимуществами современных процессоров: Большинство современных систем имеют несколько процессоров, и каждый процессор имеет несколько ядер.Многопоточность позволяет запускать разные потоки разными процессорами, тем самым позволяя более эффективно использовать системные ресурсы.
- Для сокращения времени отклика: Пользователи ожидают, что приложения будут работать быстро. Разбив обработку, необходимую для запроса, на более мелкие части и имея разные потоки, обрабатывающие обработку параллельно, можно сократить время ответа.
- Для одновременного обслуживания нескольких пользователей: Серверы приложений, такие как Tomcat, JBoss, Oracle WebLogic и IBM WebSphere, как ожидается, будут поддерживать тысячи пользователей параллельно.Многопоточность – единственный способ добиться этого. Сервер приложений порождает один поток для каждого обрабатываемого запроса.
Почему следует отслеживать потоки Java?
Приложения Java в производственной среде могут иметь сотни или тысячи параллельных потоков. При обнаружении проблемы – например, JVM занимает очень много ресурсов ЦП – возникает очевидный вопрос: какой поток вызывает скачок ЦП? И сразу же возникает следующий вопрос: какой фрагмент кода выполняет поток? Хотя важно сообщать эту информацию в режиме реального времени, также важно, чтобы эти детали были доступны для исторического анализа.Например, у вашего приложения мог произойти скачок ЦП в 2 часа ночи и он мог перестать отвечать, что вынудило вашу операционную группу перезапустить сервер. Хотя это временно решило бы проблему, в чем была причина и как предотвратить повторение этой проблемы? Наличие подробностей о том, какие потоки в JVM выполнялись в 2 часа ночи и какой поток занимал ЦП, является ключом к возможности диагностировать проблему с производительностью приложения.
Всплеск ЦП в JVM, вызванный высоким потоком ЦП Обращение к трассировке стека JVM для изоляции потока, вызывающего высокую загрузку ЦПНесколько потоков в JVM могут выполнять аналогичные задачи.Например, может потребоваться обновление файла конфигурации при обработке запроса. Поскольку несколько потоков обращаются к одному и тому же файлу конфигурации, важно синхронизировать потоки, чтобы только один поток в любое время мог обновлять файл конфигурации. Хотя синхронизация обеспечивает согласованность общего ресурса (в данном случае файла конфигурации), она также вносит возможность задержек в обработке запросов. Запросы, обрабатываемые сервером приложений, должны ждать, пока соответствующему потоку не будет разрешено войти в синхронизированный блок.Чрезмерное использование синхронизированных блоков может привести к тому, что большой процент времени обработки запроса будет потрачен на ожидание доступа к синхронизированным блокам кода. Чтобы обеспечить удобство работы с пользователем, важно обеспечить минимальную блокировку из-за синхронизации потоков.
В то же время также важно отслеживать количество потоков, порождаемых в JVM. Если параллельно создается слишком много потоков, размер памяти JVM должен быть достаточным, чтобы справиться с этой нагрузкой.В противном случае снизится производительность приложения. Администраторы также должны отслеживать случаи утечек потоков, то есть случаи, когда количество потоков в JVM продолжает увеличиваться и в конечном итоге приводит к сбою JVM.
Совет по размеру JVM: если слишком много потоков создается параллельно, размер памяти #JVM должен быть достаточного размера, чтобы справиться с этой нагрузкой. В противном случае снизится производительность приложения.
#Java
На серверах приложений есть пулы потоков, в которых потоки создаются и ожидают новых запросов пользователей.У пулов потоков есть максимальные ограничения на количество потоков в каждом пуле. Если этот предел максимального количества потоков, которые могут выполняться в пуле, достигнут, новые запросы к серверу приложений будут отклонены. Следовательно, важно отслеживать количество текущих потоков в каждом пуле.
Понимание различных состояний потока JavaМониторинг потоков Java: ключевые вопросы для ответа |
---|
Современные JVM предоставляют интерфейсы JMX, которые позволяют инструментам мониторинга отслеживать активность потоков в JVM.Ключевые вопросы, на которые вы должны попытаться ответить с помощью решения для мониторинга производительности Java-приложений, включают:
|
Полезные ресурсы
Введение в многопоточность в Python – Real Python
Смотреть сейчас В этом руководстве есть связанный видеокурс, созданный командой Real Python.Посмотрите его вместе с письменным руководством, чтобы углубить свое понимание: Threading in Python
Потоковая обработка Python позволяет вам запускать разные части вашей программы одновременно и может упростить ваш дизайн. Если у вас есть некоторый опыт работы с Python и вы хотите ускорить свою программу с помощью потоков, то это руководство для вас!
Из этой статьи вы узнаете:
- Какие темы
- Как создавать потоки и ждать их завершения
- Как использовать
ThreadPoolExecutor
- Как избежать состояния гонки
- Как использовать общие инструменты, которые предоставляет Python
threading
В этой статье предполагается, что вы знакомы с основами Python и используете как минимум версию 3.6 для запуска примеров. Если вам нужно освежиться, вы можете начать с Пути обучения Python и быстро освоиться.
Если вы не уверены, хотите ли вы использовать Python threading
, asyncio
или multiprocessing
, то вы можете проверить ускорение вашей программы Python с помощью параллелизма.
Все источники, используемые в этом руководстве, доступны вам в репозитории Real Python GitHub.
Бесплатный бонус: 5 мыслей о Python Mastery, бесплатный курс для разработчиков Python, который показывает вам план развития и образ мышления, который вам понадобится, чтобы вывести свои навыки Python на новый уровень.
Пройдите тест: Проверьте свои знания с помощью нашей интерактивной викторины «Потоки Python». По завершении вы получите оценку, чтобы вы могли отслеживать свой прогресс в обучении с течением времени:
Пройти тест »
Что такое нить?
Поток – это отдельный поток выполнения. Это означает, что в вашей программе будут происходить сразу две вещи. Но для большинства реализаций Python 3 разные потоки на самом деле не выполняются одновременно: они просто кажутся.
Заманчиво думать о многопоточности как о двух (или более) разных процессорах, работающих над вашей программой, каждый из которых одновременно выполняет независимую задачу. Это почти верно. Потоки могут выполняться на разных процессорах, но они будут выполняться только по одному.
Для одновременного выполнения нескольких задач требуется нестандартная реализация Python, написание части кода на другом языке или использование многопроцессорной обработки
, что требует дополнительных накладных расходов.
Из-за того, как работает реализация Python в CPython, многопоточность может не ускорить все задачи. Это связано с взаимодействиями с GIL, которые существенно ограничивают одновременный запуск одного потока Python.
Задачи, которые проводят большую часть своего времени в ожидании внешних событий, обычно являются хорошими кандидатами для многопоточности. Проблемы, требующие интенсивных вычислений ЦП и тратящих мало времени на ожидание внешних событий, могут вообще не выполняться быстрее.
Это верно для кода, написанного на Python и работающего в стандартной реализации CPython.Если ваши потоки написаны на C, они могут выпускать GIL и работать одновременно. Если вы используете другую реализацию Python, ознакомьтесь с документацией, чтобы узнать, как она обрабатывает потоки.
Если вы используете стандартную реализацию Python, пишете только на Python, и у вас есть проблема, связанная с процессором, вам следует вместо этого проверить модуль multiprocessing
.
Архитектура вашей программы с использованием многопоточности также может обеспечить повышение ясности проектирования.Большинство примеров, о которых вы узнаете в этом руководстве, не обязательно будут выполняться быстрее, потому что они используют потоки. Использование в них резьбы помогает сделать дизайн более понятным и понятным.
Итак, давайте прекратим говорить о потоках и начнем их использовать!
Начало потока
Теперь, когда вы получили представление о нити, давайте узнаем, как ее создать. Стандартная библиотека Python обеспечивает потоковой передачи
, которая содержит большинство примитивов, которые вы увидите в этой статье. Поток
в этом модуле красиво инкапсулирует потоки, обеспечивая чистый интерфейс для работы с ними.
Чтобы запустить отдельный поток, вы создаете экземпляр Thread
, а затем сообщаете ему .start ()
:
1 импортный лесозаготовка
2импорт резьбы
3импорт время
4
5def функция_потока (имя):
6 logging.info ("Тема% s: запускается", имя)
7 раз. Сон (2)
8 logging.info ("Тема% s: завершение", имя)
9
10if __name__ == "__main__":
11 format = "% (asctime) s:% (message) s"
12 лесозаготовок.basicConfig (формат = формат, уровень = logging.INFO,
13 datefmt = "% H:% M:% S")
14
15 logging.info («Главное: перед созданием потока»)
16 x = threading.Thread (цель = функция_потока, args = (1,))
17 logging.info («Главное: перед запуском потока»)
18 x.start ()
19 logging.info («Главное: дождаться завершения потока»)
20 # x.join ()
21 logging.info («Главное: все готово»)
Если вы посмотрите на операторы регистрации, вы увидите, что основной раздел
создает и запускает поток:
x = нарезание резьбы.Поток (target = thread_function, args = (1,))
x.start ()
Когда вы создаете Thread
, вы передаете ему функцию и список, содержащий аргументы этой функции. В этом случае вы указываете потоку Thread
запустить thread_function ()
и передать ему 1
в качестве аргумента.
В этой статье вы будете использовать последовательные целые числа в качестве имен для ваших цепочек. Существует threading.get_ident ()
, который возвращает уникальное имя для каждого потока, но обычно они не короткие и легко читаемые.
thread_function ()
сам по себе мало что делает. Он просто регистрирует некоторые сообщения с time.sleep ()
между ними.
Когда вы запустите эту программу как есть (с закомментированной строкой двадцать), результат будет выглядеть так:
$ ./single_thread.py
Главное: перед созданием потока
Основной: перед запуском потока
Поток 1: начало
Main: дождитесь завершения потока
Главное: все готово
Поток 1: отделка
Вы заметите, что Thread
завершился после того, как завершился раздел Main
вашего кода.Вы вернетесь к тому, почему это так, и поговорите о таинственной двадцатой строке в следующем разделе.
Демонические потоки
В информатике, демон
– это процесс, который выполняется в фоновом режиме.
Python threading
имеет более конкретное значение для демона
. Демон поток
будет завершен сразу после выхода из программы. Один из способов подумать об этих определениях – рассмотреть поток демона
как поток, который работает в фоновом режиме, не беспокоясь о его завершении.
Если программа выполняет потоков
, которые не являются демонами
, то программа будет ждать завершения этих потоков, прежде чем завершиться. Потоки
, – это демоны , однако при выходе из программы просто уничтожаются, где бы они ни находились.
Давайте внимательнее посмотрим на результат вашей программы выше. Последние две строчки представляют интерес. Когда вы запустите программу, вы заметите паузу (около 2 секунд) после того, как __main__
напечатал свое сообщение all done
и до того, как поток будет завершен.
Эта пауза – это Python, ожидающий завершения недемонического потока. Когда ваша программа Python завершается, частью процесса выключения является очистка подпрограммы потоковой передачи.
Если вы посмотрите на исходный код Python threading
, вы увидите, что threading._shutdown ()
проходит через все запущенные потоки и вызывает .join ()
для всех, у которых нет демона Установлен флаг
.
Итак, ваша программа ожидает выхода, потому что сам поток ожидает в спящем режиме.Как только он завершит и напечатает сообщение, .join ()
вернется, и программа сможет выйти.
Часто это именно то, что вам нужно, но у нас есть и другие варианты. Давайте сначала повторим программу с потоком демона
. Это можно сделать, изменив способ создания потока
, добавив флаг daemon = True
:
x = threading.Thread (target = thread_function, args = (1,), демон = True)
Теперь, когда вы запустите программу, вы должны увидеть следующий результат:
$./daemon_thread.py
Главное: перед созданием потока
Основной: перед запуском потока
Поток 1: начало
Main: дождитесь завершения потока
Главное: все готово
Разница в том, что последняя строка вывода отсутствует. thread_function ()
не удалось выполнить. Это был поток демона , поэтому, когда __main__
достиг конца своего кода и программа хотела завершить работу, демон был убит.
соединение ()
a РезьбаДемонические потоки удобны, но как насчет того, чтобы дождаться остановки потока? А как насчет того, чтобы сделать это и не выходить из программы? Теперь давайте вернемся к исходной программе и посмотрим на закомментированную строку двадцать:
. Чтобы указать одному потоку дождаться завершения другого потока, вы вызываете .присоединиться ()
. Если вы раскомментируете эту строку, основной поток остановится и будет ждать завершения потока x
.
Вы проверяли это на коде с потоком демона или обычным потоком? Оказывается, это неважно. Если вы .join ()
поток, этот оператор будет ждать, пока любой из типов потоков не завершится.
Работа с большим количеством потоков
Пример кода до сих пор работал только с двумя потоками: основным потоком и тем, который вы начали с потоковой передачи .Объект Thread
.
Часто возникает необходимость запустить несколько потоков, чтобы они выполняли интересную работу. Давайте начнем с более сложного способа сделать это, а затем перейдем к более легкому методу.
Более сложный способ запуска нескольких потоков – тот, который вы уже знаете:
импорт журнала
импорт потоковой передачи
время импорта
def thread_function (имя):
logging.info ("Тема% s: запускается", имя)
время сна (2)
logging.info ("Тема% s: завершение", имя)
если __name__ == "__main__":
format = "% (asctime) s:% (сообщение) s"
Ведение журнала.basicConfig (формат = формат, уровень = logging.INFO,
datefmt = "% H:% M:% S")
потоки = список ()
для индекса в диапазоне (3):
logging.info ("Main: создать и запустить поток% d.", index)
x = threading.Thread (target = thread_function, args = (индекс,))
threads.append (x)
x.start ()
для индекса поток в перечислении (потоки):
logging.info ("Main: перед присоединением к потоку% d.", index)
thread.join ()
logging.info ("Основная часть: поток% d завершен", индекс)
Этот код использует тот же механизм, который вы видели выше, для запуска потока, создания объекта Thread
и последующего вызова .начало ()
. Программа хранит список объектов Thread
, чтобы затем ждать их позже, используя .join ()
.
Многократный запуск этого кода, вероятно, даст интересные результаты. Вот пример вывода с моей машины:
$ ./multiple_threads.py
Основной: создать и запустить поток 0.
Поток 0: начало
Основной: создать и запустить поток 1.
Поток 1: начало
Основной: создать и запустить поток 2.
Поток 2: начало
Основной: перед присоединением к потоку 0.Поток 2: отделка
Поток 1: отделка
Поток 0: отделка
Основной: поток 0 завершен
Основной: перед присоединением к потоку 1.
Основной: поток 1 завершен
Основной: перед присоединением к потоку 2.
Основной: поток 2 выполнен
Если вы внимательно просмотрите выходные данные, вы увидите, что все три потока запускаются в ожидаемом порядке, но в этом случае они заканчиваются в обратном порядке! Несколько прогонов приведут к разному порядку. Найдите сообщение Thread x: finish
, которое сообщит вам, когда каждая цепочка завершена.
Порядок выполнения потоков определяется операционной системой и его довольно сложно предсказать. Это может (и, вероятно, будет) варьироваться от запуска к запуску, поэтому вам нужно знать об этом, когда вы разрабатываете алгоритмы, использующие потоки.
К счастью, Python предоставляет вам несколько примитивов, которые вы рассмотрите позже, чтобы помочь координировать потоки и заставить их работать вместе. Перед этим давайте посмотрим, как немного упростить управление группой потоков.
Использование
ThreadPoolExecutor
Есть более простой способ создать группу потоков, чем тот, который вы видели выше.Он называется ThreadPoolExecutor
и является частью стандартной библиотеки в concurrent.futures
(начиная с Python 3.2).
Самый простой способ создать его – в качестве диспетчера контекста, используя оператор с оператором
для управления созданием и уничтожением пула.
Вот __main__
из последнего примера, переписанный для использования ThreadPoolExecutor
:
импорт одновременных фьючерсов
# [остальной код]
если __name__ == "__main__":
format = "% (asctime) s:% (сообщение) s"
Ведение журнала.basicConfig (формат = формат, уровень = logging.INFO,
datefmt = "% H:% M:% S")
с concurrent.futures.ThreadPoolExecutor (max_workers = 3) в качестве исполнителя:
executeor.map (функция_потока, диапазон (3))
Код создает ThreadPoolExecutor
в качестве диспетчера контекста, сообщая ему, сколько рабочих потоков он хочет в пуле. Затем он использует .map ()
для пошагового выполнения итерации вещей, в вашем случае range (3)
, передавая каждое из них потоку в пуле.
Конец с блоком
заставляет ThreadPoolExecutor
выполнить .join ()
для каждого из потоков в пуле. настоятельно рекомендует использовать ThreadPoolExecutor
в качестве диспетчера контекста, когда это возможно, чтобы никогда не забыть .join ()
потоков.
Примечание: Использование ThreadPoolExecutor
может вызвать некоторые сбивающие с толку ошибки.
Например, если вы вызываете функцию, которая не принимает параметров, но передаете ей параметры в .map ()
, поток выдаст исключение.
К сожалению, ThreadPoolExecutor
скроет это исключение, и (в случае выше) программа завершится без вывода. Поначалу это может быть довольно запутанным при отладке.
При запуске исправленного кода примера будет получен следующий результат:
$ ./executor.py
Поток 0: начало
Поток 1: начало
Поток 2: начало
Поток 1: отделка
Поток 0: отделка
Поток 2: отделка
Снова обратите внимание на то, что Поток 1
завершился до Поток 0
.Планирование потоков выполняется операционной системой и не следует плану, который легко понять.
Условия гонки
Прежде чем перейти к другим функциям, скрытым в Python threading
, давайте немного поговорим об одной из наиболее сложных проблем, с которыми вы столкнетесь при написании многопоточных программ: условиях гонки.
После того, как вы увидели, что такое состояние гонки, и взглянули на то, что происходит, вы перейдете к некоторым примитивам, предоставляемым стандартной библиотекой, чтобы предотвратить возникновение состояний гонки.
Состояния состязания могут возникать, когда два или более потока обращаются к совместно используемому фрагменту данных или ресурсу. В этом примере вы собираетесь создать большое состояние гонки, которое происходит каждый раз, но имейте в виду, что большинство условий гонки не так очевидны. Часто они возникают редко и могут привести к запутанным результатам. Как вы понимаете, это затрудняет их отладку.
К счастью, это состояние гонки будет происходить каждый раз, и вы подробно рассмотрите его, чтобы объяснить, что происходит.
В этом примере вы собираетесь написать класс, который обновляет базу данных. Ладно, на самом деле у вас не будет базы данных: вы просто собираетесь подделать ее, потому что не в этом суть этой статьи.
В вашем FakeDatabase
будут методы .__ init __ ()
и .update ()
:
класс FakeDatabase:
def __init __ (сам):
self.value = 0
def update (self, name):
logging.info ("Тема% s: начало обновления", имя)
local_copy = self.значение
local_copy + = 1
time.sleep (0,1)
self.value = local_copy
logging.info ("Тема% s: завершение обновления", имя)
FakeDatabase
отслеживает один номер: . Значение
. Это будут общие данные, на которых вы увидите состояние гонки.
.__ init __ ()
просто инициализирует .value
нулевым значением. Все идет нормально.
.update ()
выглядит немного странно. Он имитирует чтение значения из базы данных, выполнение над ним некоторых вычислений, а затем запись нового значения обратно в базу данных.
В этом случае чтение из базы данных означает просто копирование .value
в локальную переменную. Вычисление заключается в том, чтобы просто добавить единицу к значению, а затем немного .sleep ()
. Наконец, он записывает значение обратно, копируя локальное значение обратно в .value
.
Вот как вы будете использовать этот FakeDatabase
:
если __name__ == "__main__":
format = "% (asctime) s:% (сообщение) s"
logging.basicConfig (формат = формат, уровень = ведение журнала.ИНФОРМАЦИЯ,
datefmt = "% H:% M:% S")
база данных = FakeDatabase ()
logging.info («Тестирование обновления. Начальное значение% d.», database.value)
с concurrent.futures.ThreadPoolExecutor (max_workers = 2) в качестве исполнителя:
для индекса в диапазоне (2):
executeor.submit (база данных.обновление, индекс)
logging.info («Тестирование обновления. Конечное значение% d.», database.value)
Программа создает ThreadPoolExecutor
с двумя потоками, а затем вызывает .submit ()
для каждого из них, сообщая им запустить database.update ()
.
. Submit ()
имеет подпись, которая позволяет передавать как позиционные, так и именованные аргументы функции, работающей в потоке:
.submit (функция, * аргументы, ** kwargs)
В приведенном выше использовании индекс
передается как первый и единственный позиционный аргумент в database.update ()
. Позже в этой статье вы увидите, что аналогичным образом можно передавать несколько аргументов.
Поскольку каждый поток запускает .update ()
, а .update ()
добавляет единицу к .value
, можно ожидать, что database.value
будет 2
, когда он будет распечатан в конце. Но если бы это было так, вы бы не смотрели на этот пример. Если вы запустите приведенный выше код, результат будет выглядеть так:
$ ./racecond.py
Тестирование разблокированного обновления. Начальное значение - 0.
Тема 0: начало обновления
Тема 1: начало обновления
Тема 0: завершение обновления
Тема 1: завершение обновления
Тестирование разблокированного обновления.Конечное значение - 1.
Вы, возможно, ожидали, что это произойдет, но давайте рассмотрим детали того, что здесь происходит на самом деле, так как это упростит понимание решения этой проблемы.
Одна нить
Прежде чем углубиться в эту проблему с двумя потоками, давайте сделаем шаг назад и немного поговорим о некоторых деталях того, как работают потоки.
Вы не будете вдаваться в подробности здесь, поскольку на данном уровне это не важно. Мы также упростим некоторые вещи, которые не будут технически точными, но дадут вам правильное представление о том, что происходит.
Когда вы указываете своему ThreadPoolExecutor
запускать каждый поток, вы сообщаете ему, какую функцию нужно запустить и какие параметры передать ей: executor.submit (database.update, index)
.
В результате каждый из потоков в пуле будет вызывать database.update (index)
. Обратите внимание, что база данных
является ссылкой на один объект FakeDatabase
, созданный в __main__
. Вызов .update ()
для этого объекта вызывает метод экземпляра для этого объекта.
Каждый поток будет иметь ссылку на один и тот же объект FakeDatabase
, базу данных
. Каждый поток также будет иметь уникальное значение , индекс
, чтобы облегчить чтение операторов журнала:
Когда поток запускает .update ()
, он имеет свою собственную версию всех данных локальных для функции. В случае .update ()
это local_copy
. Это определенно хорошо. В противном случае два потока, выполняющие одну и ту же функцию, всегда будут путать друг друга.Это означает, что все переменные, привязанные к функции (или локальные), являются поточно-ориентированными .
Теперь вы можете начать рассмотрение того, что произойдет, если вы запустите указанную выше программу с одним потоком и одним вызовом .update ()
.
На изображении ниже показано, как выполняется .update ()
, если выполняется только один поток. Слева показан оператор, за которым следует диаграмма, показывающая значения в local_copy потока и в общей базе данных .значение
:
Диаграмма построена таким образом, что время увеличивается по мере продвижения сверху вниз. Он начинается, когда создается Поток 1
, и заканчивается, когда он завершается.
Когда запускается поток Thread 1
, значение FakeDatabase.value
равно нулю. Первая строка кода в методе local_copy = self.value
копирует нулевое значение в локальную переменную. Затем он увеличивает значение local_copy
с помощью оператора local_copy + = 1
.Вы можете видеть, что .value
в Thread 1
устанавливается в единицу.
Следующий вызывается time.sleep ()
, который приостанавливает текущий поток и позволяет другим потокам выполняться. Поскольку в этом примере только один поток, это не имеет никакого эффекта.
Когда Поток 1
просыпается и продолжает работу, он копирует новое значение из local_copy
в FakeDatabase.value
, а затем поток завершается. Вы можете видеть, что database.value
установлен в единицу.
Пока все хорошо. Вы выполнили .update ()
один раз, и значение FakeDatabase.value
увеличилось до единицы.
Две нити
Возвращаясь к состоянию гонки, два потока будут работать одновременно, но не одновременно. У каждого из них будет своя собственная версия local_copy
, и каждый будет указывать на одну и ту же базу данных
. Именно этот общий объект базы данных будет вызывать проблемы.
Программа начинается с Поток 1
выполняется .обновление ()
:
Когда Thread 1
вызывает time.sleep ()
, он позволяет другому потоку начать работу. Здесь все становится интересно.
Поток 2
запускается и выполняет те же операции. Он также копирует database.value
в свой частный local_copy
, и этот общий database.value
еще не обновлен:
Когда Thread 2
наконец переходит в спящий режим, общая база данных .значение
все еще не изменено и равно нулю, и обе частные версии local_copy
имеют значение один.
Поток 1
теперь просыпается и сохраняет свою версию local_copy
, а затем завершается, давая потоку 2
последний шанс на выполнение. Поток 2
не знает, что Поток 1
запустил и обновил database.value
, пока он спал. Он хранит его версию local_copy
в базе данных .значение
, также установив его на единицу:
Два потока имеют чередующийся доступ к одному общему объекту, перезаписывая результаты друг друга. Подобные условия гонки могут возникнуть, когда один поток освобождает память или закрывает дескриптор файла до того, как другой поток завершит доступ к нему.
Почему это не глупый пример
Приведенный выше пример создан для того, чтобы гарантировать, что состояние гонки возникает каждый раз, когда вы запускаете свою программу. Поскольку операционная система может поменять поток в любое время, можно прервать такой оператор, как x = x + 1
, после того, как он прочитал значение x
, но до того, как он записал обратно увеличенное значение.
Подробности того, как это происходит, довольно интересны, но не нужны для остальной части этой статьи, поэтому не стесняйтесь пропустить этот скрытый раздел.
Приведенный выше код не так уж и прост, как вы могли подумать. Он был разработан, чтобы вызывать состояние гонки каждый раз, когда вы его запускаете, но это значительно упрощает решение, чем большинство условий гонки.
При рассмотрении условий гонки следует иметь в виду две вещи:
Даже такая операция, как
x + = 1
, требует от процессора множества шагов.Каждый из этих шагов представляет собой отдельную инструкцию для процессора.Операционная система может в любое время поменять местами, какой поток выполняет . Нить можно поменять местами после любой из этих небольших инструкций. Это означает, что поток можно перевести в спящий режим, чтобы позволить другому потоку работать в середине оператора Python.
Давайте рассмотрим это подробнее. В REPL ниже показана функция, которая принимает параметр и увеличивает его:
>>> >>> def inc (x):
... x + = 1
...
>>> import dis
>>> dis.dis (inc)
2 0 LOAD_FAST 0 (x)
2 LOAD_CONST 1 (1)
4 INPLACE_ADD
6 STORE_FAST 0 (x)
8 LOAD_CONST 0 (Нет)
10 RETURN_VALUE
В примере REPL используется dis
из стандартной библиотеки Python, чтобы показать более мелкие шаги, которые процессор выполняет для реализации вашей функции. Он выполняет LOAD_FAST
для значения данных x
, он выполняет LOAD_CONST 1
, а затем использует INPLACE_ADD
для сложения этих значений.
Мы останавливаемся здесь по особой причине. Это точка в .update ()
выше, где time.sleep ()
заставил потоки переключиться. Вполне возможно, что время от времени операционная система будет переключать потоки в этот точный момент, даже без sleep ()
, но вызов sleep ()
заставляет это происходить каждый раз.
Как вы узнали выше, операционная система может менять потоки в любое время. Вы перешли по этому списку к выписке с пометкой 4
.Если операционная система заменяет этот поток и запускает другой поток, который также изменяет x
, то, когда этот поток возобновляется, он перезапишет x
с неправильным значением.
Технически в этом примере не будет состояния гонки, потому что x
является локальным для inc ()
. Однако он показывает, как поток может быть прерван во время одной операции Python. Тот же набор операций LOAD, MODIFY, STORE также выполняется с глобальными и общими значениями.Вы можете исследовать с помощью модуля dis
и доказать это сами.
Такое состояние гонки встречается редко, но помните, что редкое событие, происходящее за миллионы итераций, может произойти. Редкость этих состояний гонки делает их намного труднее отлаживать, чем обычные ошибки.
А теперь вернемся к регулярному обучению!
Теперь, когда вы увидели состояние гонки в действии, давайте узнаем, как их решить!
Базовая синхронизация с использованием блокировки
Есть несколько способов избежать или решить условия гонки.Здесь вы не будете рассматривать их все, но некоторые из них используются часто. Начнем с Lock
.
Чтобы решить указанное выше состояние гонки, вам нужно найти способ разрешить только одному потоку за раз в раздел чтения-изменения-записи вашего кода. Самый распространенный способ сделать это в Python называется Lock
. В некоторых других языках эта же идея называется мьютексом
. Mutex происходит от MUTual Exclusion, что и делает блокировка Lock
.
A Замок
- это объект, который действует как проход через холл. Только один поток одновременно может иметь Lock
. Любой другой поток, которому требуется блокировка Lock
, должен дождаться, пока владелец блокировки Lock
не откажется от него.
Основные функции для этого: .acquire ()
и .release ()
. Поток вызовет my_lock.acquire ()
, чтобы получить блокировку. Если блокировка уже удерживается, вызывающий поток будет ждать, пока она не будет снята.Здесь есть важный момент. Если один поток получит блокировку, но никогда не вернет ее, ваша программа застрянет. Подробнее об этом вы узнаете позже.
К счастью, Python Lock
также будет работать как диспетчер контекста, поэтому вы можете использовать его в операторе с
, и он автоматически освобождается, когда блок с
завершает работу по любой причине.
Давайте посмотрим на FakeDatabase
с добавленным блокировкой Lock
. Вызывающая функция остается прежней:
класс FakeDatabase:
def __init __ (сам):
себя.значение = 0
self._lock = threading.Lock ()
def locked_update (я, имя):
logging.info ("Тема% s: начало обновления", имя)
logging.debug ("Тема% s собирается заблокировать", имя)
с self._lock:
logging.debug ("Поток% s заблокирован", имя)
local_copy = self.value
local_copy + = 1
time.sleep (0,1)
self.value = local_copy
logging.debug ("Тема% s собирается снять блокировку", имя)
logging.debug ("Тема% s после выпуска", имя)
Ведение журнала.info ("Тема% s: завершение обновления", имя)
Помимо добавления набора журналов отладки, чтобы вы могли более четко видеть блокировку, большим изменением здесь является добавление члена с именем ._lock
, который является объектом threading.Lock ()
. Этот ._lock
инициализируется в разблокированном состоянии и блокируется и освобождается с помощью оператора
.
Здесь стоит отметить, что поток, выполняющий эту функцию, будет удерживать эту блокировку Lock
до тех пор, пока полностью не завершит обновление базы данных.В данном случае это означает, что он будет удерживать блокировку Lock
, пока копирует, обновляет, находится в спящем режиме, а затем записывает значение обратно в базу данных.
Если вы запустите эту версию с настройкой ведения журнала на уровень предупреждения, вы увидите следующее:
$ ./fixrace.py
Тестирование заблокированного обновления. Начальное значение - 0.
Тема 0: начало обновления
Тема 1: начало обновления
Тема 0: завершение обновления
Тема 1: завершение обновления
Тестирование заблокированного обновления. Конечное значение - 2.
Посмотрите на это. Ваша программа наконец-то заработала!
Вы можете включить полное ведение журнала, установив уровень DEBUG
, добавив этот оператор после настройки вывода журнала в __main__
:
лесозаготовка.getLogger (). setLevel (ведение журнала.DEBUG)
Запуск этой программы с включенным ведением журнала DEBUG
выглядит так:
$ ./fixrace.py
Тестирование заблокированного обновления. Начальное значение - 0.
Тема 0: начало обновления
Поток 0 собирается заблокировать
Поток 0 заблокирован
Тема 1: начало обновления
Поток 1 собирается заблокировать
Поток 0 собирается снять блокировку
Тема 0 после релиза
Тема 0: завершение обновления
Поток 1 заблокирован
Поток 1 собирается снять блокировку
Тема 1 после релиза
Тема 1: завершение обновления
Тестирование заблокированного обновления.Конечное значение - 2.
В этих выходных данных вы можете видеть, что Thread 0
получает блокировку и все еще удерживает ее, когда переходит в спящий режим. Затем запускается поток 1
и пытается получить ту же блокировку. Поскольку Thread 0
все еще удерживает его, Thread 1
должен ждать. Это взаимное исключение, которое обеспечивает замок Lock
.
Многие примеры в оставшейся части этой статьи будут иметь ведение журнала уровня WARNING
и DEBUG
.Обычно мы показываем только выход уровня WARNING
, поскольку журналы DEBUG
могут быть довольно длинными. Попробуйте программы с включенным логированием и посмотрите, что они делают.
Тупик
Прежде чем двигаться дальше, вы должны рассмотреть типичную проблему при использовании Locks
. Как вы видели, если Lock
уже был получен, второй вызов .acquire ()
будет ждать, пока поток, который удерживает Lock
, не вызовет .выпуск ()
. Как вы думаете, что происходит, когда вы запускаете этот код:
импортная резьба
l = threading.Lock ()
print ("перед первым приобретением")
l.acquire ()
print ("перед вторым приобретением")
l.acquire ()
print ("дважды полученная блокировка")
Когда программа вызывает l.acquire ()
второй раз, она зависает в ожидании снятия блокировки Lock
. В этом примере вы можете исправить тупик, удалив второй вызов, но тупиковые ситуации обычно возникают из-за одной из двух тонких вещей:
- Ошибка реализации, из-за которой блокировка
- Проблема проектирования, при которой служебная функция должна вызываться функциями, которые могут иметь или не иметь уже блокировку
Первая ситуация случается иногда, но использование блокировки
в качестве диспетчера контекста значительно снижает частоту.По возможности рекомендуется писать код для использования диспетчеров контекста, поскольку они помогают избежать ситуаций, когда исключение пропускает вас через вызов .release ()
.
Проблема дизайна может быть немного сложнее на некоторых языках. К счастью, потоки Python имеют второй объект, называемый RLock
, который разработан как раз для этой ситуации. Это позволяет потоку несколько раз выполнить .acquire ()
и RLock
, прежде чем он вызовет .release ()
.Этот поток по-прежнему должен вызывать .release ()
столько же раз, сколько он вызывал .acquire ()
, но он все равно должен это делать.
Lock
и RLock
- два основных инструмента, используемых в резьбовом программировании для предотвращения состояний гонки. Есть несколько других, которые работают по-разному. Прежде чем вы посмотрите на них, давайте перейдем к немного другой проблемной области.
Производитель-Потребительская резьба
Проблема "производитель-потребитель" - это стандартная задача в области компьютерных наук, используемая для рассмотрения проблем многопоточности или синхронизации процессов.Вы рассмотрите его вариант, чтобы получить некоторое представление о том, какие примитивы предоставляет модуль Python threading
.
В этом примере вы представите программу, которой нужно читать сообщения из сети и записывать их на диск. Программа не запрашивает сообщение, когда хочет. Он должен прослушивать и принимать сообщения по мере их поступления. Сообщения не будут приходить в обычном темпе, а будут приходить пакетами. Эта часть программы называется продюсером.
С другой стороны, если у вас есть сообщение, вам нужно записать его в базу данных. Доступ к базе данных медленный, но достаточно быстрый, чтобы не отставать от среднего темпа сообщений. Это , а не достаточно быстро, чтобы успевать за пакетом сообщений. Эта часть - потребитель.
Между производителем и потребителем вы создадите конвейер
, который будет изменяться по мере того, как вы узнаете о различных объектах синхронизации.
Это базовая схема.Давайте посмотрим на решение, использующее Lock
. Он не работает идеально, но в нем используются инструменты, которые вы уже знаете, так что это хорошее место для начала.
Производитель-Потребитель, использующий замок
Так как это статья о Python threading
, и поскольку вы только что прочитали о примитиве Lock
, давайте попробуем решить эту проблему с двумя потоками, используя Lock
или два.
Общая схема заключается в том, что существует поток производителя
, который читает из поддельной сети и помещает сообщение в конвейер
:
импорт случайный
SENTINEL = объект ()
def производитель (конвейер):
"" "Представьте, что мы получаем сообщение из сети."" "
для индекса в диапазоне (10):
сообщение = random.randint (1, 101)
logging.info ("Производитель получил сообщение:% s", сообщение)
pipeline.set_message (сообщение, "Производитель")
# Отправьте дозорное сообщение, чтобы сообщить потребителю, что мы закончили
pipeline.set_message (SENTINEL, "Производитель")
Чтобы сгенерировать фальшивое сообщение, производитель
получает случайное число от единицы до ста. Он вызывает .set_message ()
на конвейере
, чтобы отправить его потребителю
.
Производитель
также использует значение SENTINEL
, чтобы сигнализировать потребителю о необходимости остановиться после того, как он отправил десять значений. Это немного неудобно, но не волнуйтесь, вы увидите способы избавиться от этого значения SENTINEL
после того, как проработаете этот пример.
По другую сторону трубопровода
находится потребитель:
def потребитель (конвейер):
"" "Представьте, что мы сохраняем число в базе данных." ""
сообщение = 0
пока сообщение не SENTINEL:
сообщение = конвейер.get_message ("Потребитель")
если сообщение не SENTINEL:
logging.info ("Сообщение, хранящееся у потребителя:% s", сообщение)
Потребитель
считывает сообщение из конвейера
и записывает его в поддельную базу данных, которая в данном случае просто выводит его на дисплей. Если он получает значение SENTINEL
, он возвращается из функции, которая завершает поток.
Прежде чем вы посмотрите на действительно интересную часть, конвейер
, вот раздел __main__
, который порождает следующие потоки:
если __name__ == "__main__":
format = "% (asctime) s:% (сообщение) s"
Ведение журнала.basicConfig (формат = формат, уровень = logging.INFO,
datefmt = "% H:% M:% S")
# logging.getLogger (). setLevel (logging.DEBUG)
pipeline = Трубопровод ()
с concurrent.futures.ThreadPoolExecutor (max_workers = 2) в качестве исполнителя:
executeor.submit (продюсер, конвейер)
executeor.submit (потребитель, конвейер)
Это должно выглядеть довольно знакомо, поскольку оно близко к коду __main__
в предыдущих примерах.
Помните, что вы можете включить ведение журнала DEBUG
, чтобы увидеть все сообщения журнала, раскомментировав эту строку:
# лог.getLogger (). setLevel (ведение журнала.DEBUG)
Может быть полезно просмотреть сообщения журнала DEBUG
, чтобы точно увидеть, где каждый поток получает и снимает блокировки.
Теперь давайте посмотрим на конвейер
, который передает сообщения от производителя
потребителю
:
класс Трубопровод:
"" "
Класс, обеспечивающий единый конвейер между производителем и потребителем.
"" "
def __init __ (сам):
себя.сообщение = 0
self.producer_lock = threading.Lock ()
self.consumer_lock = threading.Lock ()
self.consumer_lock.acquire ()
def get_message (я, имя):
logging.debug ("% s: собирается получить блокировку", имя)
self.consumer_lock.acquire ()
logging.debug ("% s: есть getlock", имя)
message = self.message
logging.debug ("% s: собирается выпустить сетлок", имя)
self.producer_lock.release ()
logging.debug ("% s: setlock выпущен", имя)
ответное сообщение
def set_message (я, сообщение, имя):
Ведение журнала.debug ("% s: собирается получить setlock", имя)
self.producer_lock.acquire ()
logging.debug ("% s: есть setlock", имя)
self.message = сообщение
logging.debug ("% s: собирается выпустить блокировку", имя)
self.consumer_lock.release ()
logging.debug ("% s: getlock выпущен", имя)
Вау! Это много кода. Довольно большой процент из них - это просто записи в журнал, чтобы было легче увидеть, что происходит, когда вы их запускаете. Вот тот же код со всеми удаленными операторами журнала:
класс Трубопровод:
"" "
Класс, обеспечивающий единый конвейер между производителем и потребителем."" "
def __init __ (сам):
self.message = 0
self.producer_lock = threading.Lock ()
self.consumer_lock = threading.Lock ()
self.consumer_lock.acquire ()
def get_message (я, имя):
self.consumer_lock.acquire ()
message = self.message
self.producer_lock.release ()
ответное сообщение
def set_message (я, сообщение, имя):
self.producer_lock.acquire ()
self.message = сообщение
self.consumer_lock.release ()
Это кажется немного более управляемым.Конвейер
в этой версии вашего кода состоит из трех членов:
-
.message
сохраняет передаваемое сообщение. -
.producer_lock
- это объектthreading.Lock
, который ограничивает доступ к сообщению для потока производителя . -
.consumer_lock
также является потоком.Lock
, который ограничивает доступ к сообщению потоком потребителя.
__init __ ()
инициализирует эти три члена, а затем вызывает .acquire ()
на .consumer_lock
. Это состояние, в котором вы хотите начать. Производителю
разрешено добавлять новое сообщение, но потребителю необходимо дождаться появления сообщения.
.get_message ()
и .set_messages ()
почти противоположны. .get_message ()
вызывает .acquire ()
на consumer_lock
.Это вызов, который заставит потребителя
ждать, пока сообщение не будет готово.
После того, как потребитель
получил .consumer_lock
, он копирует значение из .message
и затем вызывает .release ()
на .producer_lock
. Снятие этой блокировки позволяет производителю
вставить следующее сообщение в конвейер
.
Прежде чем перейти к .set_message ()
, в происходит кое-что тонкое.get_message ()
, который довольно легко пропустить. Может показаться заманчивым избавиться от сообщения
и просто завершить функцию с помощью return self.message
. Посмотрите, сможете ли вы понять, почему вы не хотите этого делать, прежде чем двигаться дальше.
Вот ответ. Как только потребитель
вызывает .producer_lock.release ()
, его можно заменить, и производитель
может начать работу. Это могло произойти до возврата .release ()
! Это означает, что существует небольшая вероятность того, что, когда функция вернет self.сообщение
, которое на самом деле может быть следующим сгенерированным сообщением , поэтому вы потеряете первое сообщение. Это еще один пример состояния гонки.
Переходя к .set_message ()
, вы можете увидеть противоположную сторону транзакции. Производитель
вызовет это с сообщением. Он получит .producer_lock
, установит .message
и вызовет .release ()
на consumer_lock
, что позволит потребителю
прочитать это значение.
Давайте запустим код, в котором для ведения журнала установлено значение WARNING
, и посмотрим, как это выглядит:
$ ./prodcom_lock.py
Производитель получил данные 43
Производитель получил данные 45
Потребительские данные хранения: 43
Производитель получил данные 86
Потребительские данные хранения: 45
Производитель получил данные 40
Потребительские хранилища данных: 86
Производитель получил данные 62
Потребительские данные хранения: 40
Производитель получил данные 15
Потребительские данные хранения: 62
Производитель получил данные 16
Потребительские данные хранения: 15
Производитель получил данные 61
Потребительские данные хранения: 16
Производитель получил данные 73
Потребительские хранилища данных: 61
Производитель получил данные 22
Потребительские данные хранения: 73
Потребительские данные хранения: 22
Сначала вам может показаться странным, что производитель получает два сообщения до того, как потребитель запустится.Если вы посмотрите на производителя
и .set_message ()
, вы заметите, что единственное место, где он будет ждать блокировки Lock
, - это когда он пытается поместить сообщение в конвейер. Это делается после того, как производитель
получает сообщение и регистрирует его.
Когда производитель
пытается отправить это второе сообщение, он вызывает .set_message ()
второй раз и блокируется.
Операционная система может поменять местами потоки в любое время, но обычно позволяет каждому потоку иметь разумное количество времени для выполнения перед его заменой.Вот почему производитель
обычно работает до тех пор, пока не заблокирует второй вызов .set_message ()
.
Однако, как только поток заблокирован, операционная система всегда заменяет его и находит другой поток для выполнения. В этом случае единственный другой поток, которому нужно что-то делать, - это потребитель
.
Потребитель
вызывает .get_message ()
, который читает сообщение и вызывает .release ()
на .producer_lock
, тем самым позволяя производителю
снова запускаться при следующей смене потоков.
Обратите внимание, что первое сообщение было 43
, и это именно то, что прочитал потребитель
, хотя производитель
уже сгенерировал сообщение 45
.
Хотя это и работает для этого ограниченного теста, это не лучшее решение проблемы производителя-потребителя в целом, потому что оно допускает только одно значение в конвейере за раз. Когда производитель
получит пачку сообщений, ему некуда будет их разместить.
Давайте перейдем к лучшему способу решения этой проблемы, используя очередь
.
Производитель-Потребитель, использующий очередь
Если вы хотите иметь возможность обрабатывать более одного значения в конвейере одновременно, вам понадобится структура данных для конвейера, которая позволяет этому числу увеличиваться и уменьшаться при резервном копировании данных от производителя
.
Python имеет модуль очереди
, который, в свою очередь, имеет класс Queue
. Давайте изменим конвейер
, чтобы использовать очередь
вместо простой переменной, защищенной блокировкой Lock
.Вы также будете использовать другой способ остановки рабочих потоков, используя другой примитив из Python threading
, Event
.
Начнем с события , события
. Объект threading.Event
позволяет одному потоку сигнализировать о событии
, в то время как многие другие потоки могут ожидать возникновения этого события
. Ключевое использование в этом коде заключается в том, что потокам, ожидающим события, не обязательно останавливать то, что они делают, они могут просто время от времени проверять состояние события
.
Срабатывание события может происходить по многим причинам. В этом примере основной поток просто некоторое время будет спать, а затем .set ()
it:
1if __name__ == "__main__":
2 format = "% (asctime) s:% (message) s"
3 logging.basicConfig (формат = формат, уровень = logging.INFO,
4 datefmt = "% H:% M:% S")
5 # logging.getLogger (). SetLevel (logging.DEBUG)
6
7 pipeline = Трубопровод ()
8 событие = threading.Event ()
9 с параллельными фьючерсами.ThreadPoolExecutor (max_workers = 2) в качестве исполнителя:
10 executor.submit (продюсер, конвейер, событие)
11 executor.submit (потребитель, конвейер, событие)
12
13 time.sleep (0,1)
14 logging.info («Главное: собираюсь установить событие»)
15 event.set ()
Единственные изменения здесь - это создание объекта события
в строке 6, передача события
в качестве параметра в строках 8 и 9, и последний раздел в строках с 11 по 13, которые спят на секунду, регистрируют сообщение, а затем позвоните по номеру .set ()
по событию.
Производитель
тоже не пришлось сильно менять:
1def производитель (конвейер, событие):
2 "" "Представьте, что мы получаем номер из сети." ""
3, а не event.is_set ():
4 сообщение = random.randint (1, 101)
5 logging.info ("Производитель получил сообщение:% s", сообщение)
6 pipeline.set_message (сообщение, «Производитель»)
7
8 logging.info («Производитель получил событие EXIT. Выход»)
Теперь он будет зацикливаться, пока не увидит, что событие было установлено в строке 3.Он также больше не помещает значение SENTINEL
в конвейер
.
Потребитель
пришлось поменять еще немного:
Потребитель 1def (конвейер, событие):
2 "" "Представьте, что мы сохраняем число в базе данных." ""
3, пока не event.is_set () или не pipeline.empty ():
4 message = pipeline.get_message («Потребитель»)
5 logging.info (
6 "Сохранение сообщения потребителем:% s (размер очереди =% s)",
7 сообщение,
8 трубопровод.qsize (),
9)
10
11 logging.info («Потребитель получил событие EXIT. Выход»)
Хотя вам нужно извлечь код, связанный со значением SENTINEL
, вам нужно было выполнить несколько более сложное условие и
. Он не только выполняет цикл до тех пор, пока не будет установлено событие
, но и должен продолжать цикл до тех пор, пока конвейер
не будет опустошен.
Проверка того, что очередь пуста до того, как потребитель закончит, предотвращает еще одну забавную проблему.Если потребитель
действительно выходит, в то время как конвейер
содержит сообщения, могут произойти две неприятные вещи. Во-первых, вы теряете эти последние сообщения, но более серьезным является то, что производитель
может быть пойман на попытке добавить сообщение в полную очередь и никогда не вернуться.
Это происходит, если событие
запускается после того, как производитель
проверил условие .is_set ()
, но до того, как он вызовет конвейер .set_message ()
.
Если это произойдет, производитель может проснуться и выйти с полностью заполненной очередью. Затем производитель
вызовет .set_message ()
, который будет ждать, пока в очереди не появится место для нового сообщения. Потребитель
уже вышел, поэтому этого не произойдет, и производитель
не выйдет.
Остальной потребитель
должен выглядеть знакомо.
Однако конвейер
кардинально изменился:
Конвейер 1 класса (очередь.Очередь):
2 def __init __ (сам):
3 super () .__ init __ (maxsize = 10)
4
5 def get_message (я, имя):
6 logging.debug ("% s: собирается из очереди", имя)
7 значение = self.get ()
8 logging.debug ("% s: получено% d из очереди", имя, значение)
9 возвращаемое значение
10
11 def set_message (я, значение, имя):
12 logging.debug («% s: собирается добавить% d в очередь», имя, значение)
13 self.put (значение)
14 logging.debug ("% s: добавлено% d в очередь", имя, значение)
Вы можете видеть, что конвейер
является подклассом очереди .Очередь
. Очередь
имеет необязательный параметр при инициализации, чтобы указать максимальный размер очереди.
Если вы дадите положительное число для maxsize
, это ограничит очередь этим количеством элементов, в результате чего .put ()
будет блокироваться до тех пор, пока не будет меньше maxsize
элементов. Если вы не укажете maxsize
, очередь будет увеличиваться до пределов памяти вашего компьютера.
.get_message ()
и .set_message ()
стал намного меньше. В основном они заключают .get ()
и .put ()
в очередь
. Вам может быть интересно, куда делся весь код блокировки, который не позволяет потокам вызывать состояния гонки.
Основные разработчики, написавшие стандартную библиотеку, знали, что очередь
часто используется в многопоточных средах, и включали весь этот код блокировки внутри самой очереди
. Очередь
является потокобезопасной.
Запуск этой программы выглядит следующим образом:
$ ./prodcom_queue.py
Продюсер получил сообщение: 32
Продюсер получил сообщение: 51
Продюсер получил сообщение: 25
Продюсер получил сообщение: 94
Продюсер получил сообщение: 29
Сообщение потребителя, сохраняющее: 32 (размер очереди = 3)
Продюсер получил сообщение: 96
Сообщение потребителя, сохраняющее: 51 (размер очереди = 3)
Продюсер получил сообщение: 6
Сообщение, сохраняющее потребителя: 25 (размер очереди = 3)
Продюсер получил сообщение: 31
[удалено много строк]
Продюсер получил сообщение: 80
Сообщение потребителя, сохраняющее: 94 (размер очереди = 6)
Продюсер получил сообщение: 33
Сообщение потребителя, сохраняющее: 20 (размер очереди = 6)
Продюсер получил сообщение: 48
Сообщение потребителя, сохраняющее: 31 (размер очереди = 6)
Продюсер получил сообщение: 52
Сообщение потребителя, сохраняющее: 98 (размер очереди = 6)
Main: собираюсь назначить событие
Продюсер получил сообщение: 13
Сообщение потребителя, сохраняющее: 59 (размер очереди = 6)
Продюсер получил событие EXIT.Выход
Сообщение потребителя, сохраняющее: 75 (размер очереди = 6)
Сообщение, хранящееся у потребителя: 97 (размер очереди = 5)
Сообщение потребителя, сохраняющее: 80 (размер очереди = 4)
Сообщение потребителя, сохраняющее: 33 (размер очереди = 3)
Сообщение потребителя, сохраняющее: 48 (размер очереди = 2)
Сообщение потребителя, сохраняющее: 52 (размер очереди = 1)
Сообщение, хранящееся у потребителя: 13 (размер очереди = 0)
Потребитель получил событие EXIT. Выход
Если вы прочитаете вывод в моем примере, то увидите, что происходит кое-что интересное. Справа вверху вы можете увидеть, что производитель
должен создать пять сообщений и поместить четыре из них в очередь.Операционная система заменила его, прежде чем он смог разместить пятый.
Потребитель
затем запустил и снял первое сообщение. Он распечатал это сообщение, а также то, насколько глубока была очередь на тот момент:
Сохранение сообщения потребителя: 32 (размер очереди = 3)
Вот как вы узнаете, что пятое сообщение еще не попало в конвейер
. Очередь уменьшается до трех после удаления одного сообщения. Вы также знаете, что очередь
может содержать десять сообщений, поэтому поток производителя
не был заблокирован очередью
.Он был заменен ОС.
Примечание: Ваш результат будет другим. Ваш результат будет меняться от запуска к запуску. Это самая интересная часть работы с потоками!
Когда программа начинает завершаться, вы можете видеть, что основной поток генерирует событие
, которое вызывает немедленный выход производителя
. У потребителя
еще есть над чем поработать, поэтому он продолжает работать, пока не очистит конвейер
.
Попробуйте поиграть с разными размерами очереди и звонками до раз.sleep ()
в производителе
или потребителе
для имитации более длительного времени доступа к сети или к диску соответственно. Даже незначительные изменения этих элементов программы сильно повлияют на ваши результаты.
Это гораздо лучшее решение проблемы производителя и потребителя, но вы можете упростить его еще больше. Pipeline
действительно не нужен для решения этой проблемы. После того, как вы уберете ведение журнала, она просто превратится в очередь . Очередь
.
Вот как выглядит окончательный код с использованием очереди .Очередь
напрямую:
импорт одновременных фьючерсов
импорт журнала
очередь импорта
случайный импорт
импорт потоковой передачи
время импорта
производитель def (очередь, событие):
"" "Представьте, что мы получаем номер из сети." ""
пока не event.is_set ():
сообщение = random.randint (1, 101)
logging.info ("Производитель получил сообщение:% s", сообщение)
queue.put (сообщение)
logging.info ("Производитель получил событие. Выходит")
def потребитель (очередь, событие):
"" "Представьте, что мы сохраняем число в базе данных."" "
пока не event.is_set () или не queue.empty ():
сообщение = queue.get ()
logging.info (
"Сохранение сообщения потребителем:% s (size =% d)", message, queue.qsize ()
)
logging.info («Потребитель получил событие. Выходит»)
если __name__ == "__main__":
format = "% (asctime) s:% (сообщение) s"
logging.basicConfig (формат = формат, уровень = logging.INFO,
datefmt = "% H:% M:% S")
pipeline = queue.Queue (maxsize = 10)
событие = threading.Event ()
с одновременным.futures.ThreadPoolExecutor (max_workers = 2) в качестве исполнителя:
executeor.submit (продюсер, конвейер, событие)
executeor.submit (потребитель, конвейер, событие)
time.sleep (0,1)
logging.info («Главное: собираюсь установить событие»)
event.set ()
Это легче читать и показывает, как использование встроенных примитивов Python может упростить сложную проблему.
Lock
и Queue
- удобные классы для решения проблем параллелизма, но есть и другие классы, предоставляемые стандартной библиотекой.Прежде чем завершить это руководство, давайте кратко рассмотрим некоторые из них.
Нарезка объектов
Есть еще несколько примитивов, предлагаемых модулем Python threading
. Хотя в приведенных выше примерах они вам не понадобились, они могут пригодиться в разных сценариях использования, поэтому хорошо с ними ознакомиться.
Семафор
Первый объект Python threading
, на который нужно обратить внимание, это threading. Семафор
- это счетчик с несколькими специальными свойствами.Во-первых, счет атомный. Это означает, что есть гарантия, что операционная система не заменит поток во время увеличения или уменьшения счетчика.
Внутренний счетчик увеличивается при вызове .release ()
и уменьшается при вызове .acquire ()
.
Следующее особое свойство состоит в том, что если поток вызывает .acquire ()
, когда счетчик равен нулю, этот поток будет блокироваться до тех пор, пока другой поток не вызовет .release ()
и увеличивает счетчик до единицы.
Семафоры часто используются для защиты ресурса с ограниченной емкостью. Например, если у вас есть пул подключений, и вы хотите ограничить размер этого пула определенным числом.
Таймер
A threading.Timer
- это способ запланировать вызов функции по прошествии определенного времени. Вы создаете таймер
, передав количество секунд ожидания и функцию для вызова:
t = нарезание резьбы.Таймер (30.0, my_function)
Вы запускаете таймер
, вызывая .start ()
. Функция будет вызываться в новом потоке в какой-то момент по истечении указанного времени, но имейте в виду, что нет никаких обещаний, что она будет вызвана точно в то время, которое вы хотите.
Если вы хотите остановить таймер Timer
, который вы уже запустили, вы можете отменить его, вызвав .cancel ()
. Вызов .cancel ()
после срабатывания таймера Timer
ничего не делает и не вызывает исключения.
Таймер
может использоваться для подсказки пользователю действия по прошествии определенного времени. Если пользователь выполняет действие до истечения таймера Timer
, может быть вызван .cancel ()
.
Барьер
A threading. Barrier
может использоваться для синхронизации фиксированного количества потоков. При создании Barrier
вызывающий должен указать, сколько потоков будет синхронизироваться на нем. Каждый поток вызывает .wait ()
на Barrier
.Все они будут оставаться заблокированными до тех пор, пока не будет ожидать указанное количество потоков, а затем все они будут освобождены одновременно.
Помните, что потоки планируются операционной системой, поэтому, даже если все потоки освобождаются одновременно, они будут запускаться по одному за раз.
Одно из применений Barrier
- позволить пулу потоков инициализироваться. Если потоки ожидают Barrier
после их инициализации, это гарантирует, что ни один из потоков не запустится до того, как все потоки завершат свою инициализацию.
Заключение: многопоточность в Python
Теперь вы многое узнали из того, что может предложить Python threading
, а также несколько примеров того, как создавать многопоточные программы и проблемы, которые они решают. Вы также видели несколько примеров проблем, возникающих при написании и отладке многопоточных программ.
Если вы хотите изучить другие варианты параллелизма в Python, ознакомьтесь с «Ускорьте свою программу Python с помощью параллелизма».
Если вы хотите подробно изучить модуль asyncio
, прочтите «Асинхронный ввод-вывод в Python: полное руководство».
Что бы вы ни делали, теперь у вас есть информация и уверенность, необходимые для написания программ с использованием потоковой передачи Python!
Особая благодарность читателю Дж. Л. Диасу за помощь в наведении порядка во введении.
Пройдите тест: Проверьте свои знания с помощью нашей интерактивной викторины «Потоки Python». По завершении вы получите оценку, чтобы вы могли отслеживать свой прогресс в обучении с течением времени:
Пройти тест »
Смотреть сейчас В этом руководстве есть связанный видеокурс, созданный командой Real Python.Посмотрите его вместе с письменным руководством, чтобы углубить свое понимание: Threading in Python
Bolt Science - Основная терминология, связанная с резьбой
Информация на резьбеДелительный диаметр (часто называемый эффективный диаметр) параллельной резьбы - это диаметр воображаемого коаксиального цилиндра, пересекающего поверхность потока таким образом, чтобы перехват на генераторе цилиндра, между точками, где он встречается с противоположным боковые стороны резьбовой канавки, равны половине номинального шага нити.
Наибольший диаметр резьбы диаметр воображаемого коаксиального цилиндра, который касается гребня внешней нити или корня Внутренний поток.
Меньший диаметр - это диаметр воображаемого цилиндра, который касается корней внешняя резьба и (или) гребни внутренней резьбы.
Гребень нити выступающий часть резьбы, будь то внутренняя или внешняя.
Корень - это дно канавки между двумя боковыми поверхностями резьбы, будь то внутренняя или внешний.
Бочки резьбы прямые стороны, соединяющие гребень и корень.
Угол резьбы - это угол между боковыми сторонами, измеренное в осевом плоском сечении.
Шаг резьбы - это расстояние,
измеряется параллельно его оси, между соответствующими точками
на смежных поверхностях в одной осевой плоскости.
NPT, BSP, JIS, SAE, метрическая система - Trimantec
Итак, вы наконец нашли правильный электромагнитный клапан, чтобы заменить сломанный. Вы звоните, чтобы проверить наличие товара, и торговый представитель спрашивает, какой тип резьбы вам нужен. Вы спросите: «Как мне узнать, какой тип резьбы мне нужен?» К счастью, мы вас прикрыли. Ниже вы найдете подробное руководство о том, как правильно определять наиболее популярные типы резьбы, используемые в промышленных компонентах.Кроме того, узнайте, когда можно использовать ленту для уплотнения резьбы в экстренных ситуациях.
Важно определить конкретный тип резьбы, который вам нужен, чтобы ваше оборудование работало наилучшим образом. Пневматические компоненты, такие как воздушные цилиндры, клапаны и блоки подготовки воздуха, оснащены отверстиями со специальной резьбой. Например, пневматические компоненты, которые мы предлагаем в нашем интернет-магазине, доступны с резьбой NPT, PT или G. Выбор правильного типа резьбы обеспечит оптимальную совместимость с вашим оборудованием.На первый взгляд резьбы могут выглядеть одинаково. Но присмотритесь повнимательнее, и вы заметите очень тонкие различия, которые сделают их несовместимыми друг с другом. Например, резьба G несовместима с резьбой NPT из-за их разных углов, форм и шагов резьбы (резьбы на дюйм).
Мы составили простое пошаговое руководство, которое поможет вам определить тип резьбы. Кроме того, мы рассмотрим некоторые из наиболее распространенных типов резьбы портов, включая NPT / NPTF, BSPP (также известный как G), BSPT, PT, Metric (M) и SAE.Чтобы упростить процесс, вам понадобится пара инструментов, но подойдет и прямая стальная линейка. Мы также рекомендуем вам загрузить это Руководство по идентификации потоков для дальнейшего использования, потому что оно, безусловно, пригодится .
Содержание:Необходимые инструменты для определения резьбы
Суппорт -
Штангенциркуль - это полезный инструмент, который измеряет внешний диаметр наружной резьбы и внутренний диаметр внутренней резьбы.Использование штангенциркуля даст вам наиболее точные и точные измерения, но прямая стальная линейка является хорошей альтернативой. Однако, если вы думаете, что будете использовать его довольно часто, вот цифровой штангенциркуль, который мы нашли на Amazon по разумной цене.
Шагомер -
Шагомер измеряет количество резьбы на дюйм. Для метрической резьбы этот инструмент измеряет расстояние между резьбой. Если вы хотите купить измеритель шага резьбы, у Grainger есть неплохой выбор.
Как определить разные типы ниток
Шаг 1 - Наружная резьба против внутренней резьбы
Во-первых, вам нужно определить, какая резьба - наружная или внутренняя. Посмотрите, где расположены нити. Если они снаружи резьбы, это наружная резьба. Если они на внутренней стороне резьбы, это внутренняя резьба. Пол цепочки не обязательно влияет на ее функциональность. Он просто служит способом различать две связи.
Наружная резьба
Внутренняя резьба
Шаг 2 - Коническая резьба против параллельной резьбы
Затем определите, коническая или параллельная резьба. Коническая резьба становится более узкой по мере того, как она выходит наружу, в то время как параллельная резьба остается того же диаметра. Иногда эту характеристику можно определить при визуальном осмотре, но если нет, может пригодиться штангенциркуль. Используйте штангенциркуль для измерения первой, четвертой и последней полной резьбы.Если измерения одинаковы, значит, они параллельны. Если размеры уменьшаются, значит, он сужается.
NPT / NPTF, BSPT и метрическая коническая резьба являются примерами конической резьбы. Эти резьбы создают уплотнение за счет заклинивания металла по металлу или небольшой деформации резьбы. Параллельная резьба часто требует уплотнительного кольца или резьбовой ленты для обеспечения плотного уплотнения.
Шаг 3 - Размер шага
Следующим шагом в определении типа вашей резьбы является определение размера шага.Размер шага резьбы - это количество витков на дюйм или расстояние между витками резьбы на метрических типах резьбы. Хотя для расчета размера шага можно использовать линейку, настоятельно рекомендуется использовать калибр шага, поскольку размеры шага могут быть очень похожими. Протестируйте пару разных размеров с помощью измерителя шага, чтобы найти наилучшее соответствие.
Измерение шага шагом
Шаг 4 - Диаметр резьбы
После того, как вы определились с размером шага, вам нужно определить диаметр резьбы.Снова используя штангенциркуль, измерьте внешний диаметр на наружной резьбе и внутренний диаметр на внутренней резьбе. Если вы обнаружите, что ваши измерения не совсем совпадают с измерениями в таблицах ниже, это нормально. Неизбежно будут небольшие различия из-за разных производителей.
Шаг 5 - Стандартный тип резьбы
Последний шаг в определении типа резьбы - определение стандарта типа резьбы. NPT, PT и G являются примерами стандартов типа резьбы.Соберите информацию из предыдущих шагов и сравните ее с измерениями в таблицах ниже. Вы также можете скачать всю эту информацию в удобном PDF-файле.
Загрузить руководство по идентификации резьбы
В начало
Примечание. Из-за различий в изготовлении диаметр резьбы может не совпадать с указанными ниже размерами.
Тип резьбы NPT / NPTF - Коническое топливо National Pipe
Этот тип резьбы чаще всего используется в Северной Америке.Вы узнаете его по сужающемуся внешнему и внутреннему диаметру, обеспечивающему самоуплотнение. При затягивании боковые стороны резьбы прижимаются друг к другу, образуя герметичное уплотнение. Тем не менее, все же рекомендуется использовать ленту из ПТФЭ или другой герметик, чтобы гарантировать полностью герметичное уплотнение.
Полусовместимым вариантом NPT является NPTF (National Pipe Taper Fuel). Это обеспечивает еще более герметичное уплотнение. Но важно отметить, что совместное использование этих вариантов снижает их герметичность.Резьба NPT не должна иметь заусенцев и смазываться смазочной пастой или лентой. Это ограничивает коррозию резьбы, которая в противном случае может сделать дальнейшую разборку практически невозможной.
Размер панели (номинальный размер) | Шаг резьбы | Наружный диаметр резьбы мм | Наружный диаметр резьбы размеры в дюймах | Внутренняя резьба I.D. мм | Внутренняя резьба I.D. дюймы |
-02 (1/8) | 27 | 10,3 | 0,41 | 9,4 | 0,37 |
-04 (1/4) | 18 | 13,7 | 0,54 | 12,4 | 0,49 |
-06 (3/8) | 18 | 17,3 | 0,68 | 15,7 | 0,62 |
-08 (1/2) | 14 | 21.3 | 0,84 | 19,3 | 0,76 |
-10 (5/8) | 14 | 22,9 | 0,90 | 21,1 | 0,83 |
-12 (3/4) | 14 | 26,9 | 1,06 | 24,9 | 0,98 |
-16 (1) | 11½ | 33,3 | 1,31 | 31,5 | 1,24 |
-20 (1) | 11½ | 42.2 | 1,66 | 40,1 | 1,58 |
-24 (1 ½) | 11½ | 48,3 | 1,90 | 46,2 | 1,82 |
-32 (2) | 11½ | 60,4 | 2,38 | 57,9 | 2,29 |
* НД. = Внешний диаметр I.D. = Внутренний диаметр
В начало
Тип резьбы BSP - труба британского стандарта
Это стандартный тип резьбы, принятый во всем мире для соединения и герметизации концов труб.Вы найдете его во всей Европе. Существует два типа потоков BSP: BSPP и BSPT. BSPP означает параллельную или прямую резьбу. Между тем, BSPT относится к конической резьбе. Иногда потоки BSPP называются потоками G, а потоки BSPT - потоками R. Вы еще не запутались?
Примечание. Коническая трубная резьба JIS (резьба PT) взаимозаменяема с резьбой BSPT.
Размер панели (номинальный размер) | Шаг резьбы | Наружная резьба O.D. мм | Наружный диаметр резьбы размеры в дюймах | Внутренняя резьба I.D. мм | Внутренняя резьба I.D. размеры в дюймах |
-02 (1/8) | 28 | 9,7 | 0,38 | 8,9 | 0,35 |
-04 (1/4) | 19 | 13,2 | 0,52 | 11,9 | 0,47 |
-06 (3/8) | 19 | 16.5 | 0,65 | 15,2 | 0.60 |
-08 (1/2) | 14 | 20,8 | 0,82 | 19,1 | 0,75 |
-10 (5/8) | 14 | 22,4 | 0,88 | 20,3 | 0,80 |
-12 (3/4) | 14 | 26,4 | 1,04 | 24,6 | 0,97 |
-16 (1) | 11 | 33.0 | 1,30 | 31,0 | 1,22 |
-20 (1) | 11 | 41,9 | 1,65 | 39,6 | 1,56 |
-24 (1 ½) | 11 | 47,8 | 1,88 | 45,5 | 1,79 |
-32 (2) | 11 | 59,7 | 2,35 | 57,4 | 2,26 |
* О.D. = Внешний диаметр I.D. = Внутренний диаметр
В начало
Тип конической трубной резьбы JIS - PT
Тип резьбыPT идентичен и взаимозаменяем с типом резьбы BSPT. Однако, поскольку наружная резьба PT не имеет развальцовки под 30 градусов, она не будет сопрягаться с внутренним вертлюгом BSPP с коническим седлом. Также мы рекомендуем использовать герметик для резьбовых соединений с резьбой PT, чтобы обеспечить герметичное уплотнение.
Размер панели (номинальный размер) | Шаг резьбы | Наружная резьба O.D. мм | Наружный диаметр резьбы размеры в дюймах | Внутренняя резьба I.D. мм | Внутренняя резьба I.D. размеры в дюймах |
-02 (1/8) | 28 | 9,4 | 0,37 | 8,1 | 0,32 |
-04 (1/4) | 19 | 13,7 | 0,53 | 12,4 | 0,49 |
-06 (3/8) | 19 | 17.2 | 0,68 | 16 | 0,62 |
-08 (1/2) | 14 | 21,5 | 0,84 | 19,8 | 0,77 |
-10 (5/8) | 14 | 23,1 | 0,91 | 20,6 | 0,81 |
-12 (3/4) | 14 | 26,9 | 1,06 | 25,4 | 1 |
-16 (1) | 11 | 34 | 1.34 | 31,8 | 1,25 |
-20 (1) | 11 | 42,6 | 1,68 | 40,4 | 1,59 |
-24 (1 ½) | 11 | 48,5 | 1,9 | 46,2 | 1,81 |
-32 (2) | 11 | 60,4 | 2,37 | 58,2 | 2,29 |
* О.D. = Внешний диаметр I.D. = Внутренний диаметр
В начало
Тип резьбы SAE - Бобышка уплотнительного кольца с прямой резьбой
SAE - Общество автомобильных инженеров - прямая резьба способна герметизировать благодаря кольцевому уплотнению Buna-N с твердостью 90. Это высоконадежный и многоразовый тип резьбы. В то время как некоторые типы резьбы требуют, чтобы резьба на наружной и внутренней стороне концов сжималась вместе для образования уплотнения, уплотнительное кольцо на этом типе резьбы предотвращает это.
Размер панели (номинальный размер) | Шаг резьбы | Наружная резьба O.D. мм | Наружный диаметр резьбы размеры в дюймах | Внутренняя резьба I.D. мм | Внутренняя резьба I.D. размеры в дюймах |
-02 (1/8) | 24 | 3,9 | 0,31 | 6,9 | 0,27 |
-03 (3/16) | 24 | 9,6 | 0,38 | 8,6 | 0,34 |
-04 (1/4) | 20 | 11.2 | 0,44 | 9,9 | 0,39 |
-05 (5/16) | 20 | 12,7 | 0,5 | 11,4 | 0,45 |
-06 (3/8) | 18 | 14,2 | 0,56 | 12,9 | 0,51 |
-08 (1/2) | 16 | 19 | 0,75 | 17 | 0,67 |
-10 (5/8) | 14 | 22.3 | 0,88 | 20,3 | 0,8 |
-12 (3/4) | 12 | 26,9 | 1,06 | 24,9 | 0,98 |
-14 (7/8) | 12 | 30 | 1,18 | 27,7 | 1,09 |
-16 (1) | 12 | 33,3 | 1,31 | 31 | 1,22 |
-20 (1) | 12 | 41.4 | 1,63 | 39,1 | 1,54 |
-24 (1 ½) | 12 | 47,7 | 1,88 | 45,5 | 1,79 |
-32 (2) | 12 | 63,5 | 2,5 | 61,2 | 2,41 |
* НД. = Внешний диаметр I.D. = Внутренний диаметр
В начало
Метрическая коническая / параллельная резьба Тип
Метрическая резьба наиболее распространена в Европе.Он имеет цилиндрический внутренний и внешний диаметр с точностью до миллиметров. Тонкий конус метрической конической резьбы обеспечивает наилучшую передачу усилия. В письменной форме вы можете обозначить метрическую резьбу с помощью заглавной буквы «M» и обозначения их номинального наружного диаметра (например, M22 x 1,5). Наконец, при измерении шага убедитесь, что вы используете метрический измеритель шага.
SI Метрический размер порта мм | Шаг резьбы мм | Наружная резьба O.D. мм | Наружный диаметр резьбы размеры в дюймах |
M5 × 0,8 | ,8 | 5 | 0,1968 |
M8 × 1,0 | 1 | 8 | 0,3150 |
M10 × 1,0 | 1 | 10 | 0,3937 |
M12 × 1,5 | 1,5 | 12 | 0,4724 |
M14 × 1,5 | 1.5 | 14 | 0,5512 |
M16 × 1,5 | 1,5 | 16 | 0,6299 |
M18 × 1,5 | 1,5 | 18 | 0,7087 |
M22 × 1,5 | 1,5 | 22 | 0,8661 |
M27 × 2,0 | 2 | 27 | 1.063 |
M33 × 2,0 | 2 | 33 | 1.299 |
M42 × 2,0 | 2 | 42 | 1,654 |
M50 × 2,0 | 2 | 50 | 1,969 |
M60 × 2,0 | 2 | 60 | 2,362 |
* НД. = Внешний диаметр
В начало
Альтернативные решения для резьбы
Airtac предлагает широкий выбор недорогих запасных частей пневматики.Однако найти ту деталь, которую нужно заменить, может оказаться непросто. К счастью, наши специалисты по продуктам могут помочь вам выяснить, какая деталь у вас под рукой. Одна важная информация, которую необходимо знать нашим специалистам по запчастям, - это тип резьбы. С Airtac у вас есть три варианта: NPT, PT или G (BSPP). Но когда у вас вышла из строя машина, последнее, что вам нужно сделать, - это достать измерительные инструменты и диаграммы, чтобы узнать, какая резьба на вашем соленоидном клапане. Вот как мы можем все это обойти, если вы в затруднительном положении.
1. Вы знаете, где было изготовлено ваше оборудование? Если ваше оборудование родом из Китая, в 9 случаях из 10 вам понадобится резьба PT. Если он был произведен в Северной Америке, вы можете использовать резьбу NPT. Вам может потребоваться обратиться к руководству пользователя, чтобы найти эту информацию, или связаться с производителем оригинального оборудования.
2. Требуется ли для вашего продукта фурнитура? Допустим, у вас есть пневматический фильтр с резьбой NPT. Возможно, удастся просто заменить эти фитинги, чтобы они были совместимы с изделиями с резьбой PT.
3. В тяжелых ситуациях используйте ленту для уплотнения резьбы из PFTE. В крайнем случае, вы можете использовать герметизирующую ленту для стыковки резьб PT и NPT вместе. Однако мы рекомендуем это в крайнем случае.
Типы ниток поначалу могут показаться сложными для понимания. Здесь есть на что обратить внимание. Типы, которые мы рассмотрели в этом руководстве, едва касаются множества различных доступных. Однако наличие правильных инструментов может иметь огромное значение. Мы надеемся, что это руководство окажется полезным и информативным.Если у вас есть какие-либо вопросы, свяжитесь с нами или просто оставьте комментарий ниже. Наконец, обязательно возьмите с собой всю эту ценную информацию в нашем загружаемом Руководстве по идентификации потоков. Он наполнен такой же полезной информацией и интерактивен!
Введение в потоки и многопоточность в OS
Поток - это исполнительный блок, который состоит из собственного программного счетчика, стека и набора регистров, где программный счетчик в основном отслеживает, какая инструкция будет выполняться следующей, набор регистров в основном содержит текущие рабочие переменные и стек в основном содержит историю выполнения
Потоки также известны как облегченные процессы.Потоки - популярный способ повысить производительность приложения за счет параллелизма. Потоки в основном используются для представления программного подхода с целью повышения производительности операционной системы просто за счет сокращения служебных потоков, что в основном эквивалентно классическому процессу.
ЦП быстро переключается между потоками, создавая иллюзию, что потоки работают параллельно.
Поскольку каждый поток имеет свой собственный независимый ресурс для выполнения процесса; таким образом, несколько процессов могут выполняться параллельно, увеличивая количество потоков.
Здесь важно отметить, что каждый поток принадлежит ровно одному процессу, а вне процесса никаких потоков не существует. Каждый поток в основном представляет собой поток управления отдельно. При реализации сетевых серверов и веб-серверов потоки были успешно использованы. Потоки обеспечивают подходящую основу для параллельного выполнения приложений на многопроцессорных системах с общей памятью.
На приведенном ниже рисунке показана работа однопоточного и многопоточного процессов:
Прежде чем двигаться дальше, давайте сначала поймем разницу между процессом и потоком.
Процесс | Резьба |
---|---|
Процесс просто означает любую выполняемую программу. | Поток просто означает сегмент процесса. |
Процесс потребляет больше ресурсов | Поток потребляет меньше ресурсов. |
Для создания процесса требуется больше времени. | Для создания потока требуется сравнительно меньше времени, чем для процесса. |
Процесс сложный | Поток известен как облегченный процесс |
Для завершения процесса требуется больше времени | Для завершения потока требуется меньше времени. |
Процессы имеют независимые данные и сегменты кода | Поток в основном разделяет сегмент данных, сегмент кода, файлы и т. Д. Со своими одноранговыми потоками. |
Процесс переключения контекста занимает больше времени. | Потоку требуется меньше времени для переключения контекста. |
Связь между процессами требует больше времени по сравнению с потоком. | Обмен данными между потоками требует меньше времени по сравнению с процессами. |
По какой-то причине, если процесс заблокирован, оставшиеся процессы могут продолжить свое выполнение | В случае, если поток уровня пользователя блокируется, все его одноранговые потоки также блокируются. |
Преимущества резьбы
Некоторые преимущества резьбы приведены ниже:
Отзывчивость
Совместное использование ресурсов, что позволяет лучше использовать ресурсы.
Экономика.Создание потоков и управление ими становится проще.
Масштабируемость. Один поток работает на одном процессоре. В многопоточных процессах потоки могут быть распределены по ряду процессоров для масштабирования.
Переключение контекста происходит плавно. Переключение контекста относится к процедуре, которой следует ЦП для перехода от одной задачи к другой.
Повышенная пропускная способность системы. Давайте возьмем для этого пример: предположим, что процесс разделен на несколько потоков, и функция каждого потока рассматривается как одно задание, тогда количество заданий, завершенных за единицу времени, увеличивается, что затем приводит к увеличению пропускной способности система.
Типы резьбы
Есть два типа резьбы:
Пользовательские потоки
Ядро потоков
Пользовательские потоки находятся над ядром и не поддерживают ядро. Это потоки, которые прикладные программисты используют в своих программах.
Потоки ядра поддерживаются ядром самой ОС. Все современные ОС поддерживают потоки уровня ядра, что позволяет ядру выполнять несколько одновременных задач и / или одновременно обслуживать несколько системных вызовов ядра.
Давайте теперь поймем основное различие между потоками уровня пользователя и потоками уровня ядра:
Темы пользовательского уровня | Потоки уровня ядра |
---|---|
Эти потоки реализуются пользователями. | Эти потоки реализуются Операционными системами |
Эти потоки не распознаются операционными системами, | Эти потоки распознаются операционными системами, |
В потоках уровня пользователя переключение контекста не требует аппаратной поддержки. | В потоках уровня ядра требуется поддержка оборудования. |
Эти резьбы в основном разработаны как зависимые резьбы. | Эти резьбы в основном разработаны как независимые. |
В потоках уровня пользователя, если один поток уровня пользователя выполняет операцию блокировки, весь процесс будет заблокирован. | С другой стороны, если один поток ядра выполняет операцию блокировки, другой поток может продолжить выполнение. |
Пример потоков пользовательского уровня: поток Java, потоки POSIX. | Пример потоков уровня ядра: Window Solaris. |
Реализация потока на уровне пользователя выполняется библиотекой потоков и очень проста. | Хотя реализация потока на уровне ядра выполняется операционной системой и является сложной задачей. |
Этот поток носит общий характер и может работать в любой операционной системе. | Это относится к операционной системе. |
Многопоточные модели
Пользовательские потоки должны быть сопоставлены с потоками ядра одной из следующих стратегий:
Модель «многие к одному»
Один к одному, модель
Многие ко многим Модель
Многие к одному, модель
В модели многие к одному многие потоки пользовательского уровня все отображаются в один поток ядра.
Управление потоками осуществляется библиотекой потоков в пользовательском пространстве, что по своей природе эффективно.
В этом случае, если библиотеки потоков пользовательского уровня реализованы в операционной системе каким-либо образом, что система их не поддерживает, то потоки ядра используют эту модель отношений «многие к одному».
Один к одному, модель
Модель «один к одному» создает отдельный поток ядра для обработки каждого пользовательского потока.
Большинство реализаций этой модели накладывают ограничение на количество создаваемых потоков.
Linux и Windows от 95 до XP реализуют модель «один-к-одному» для потоков.
Эта модель обеспечивает больше параллелизма, чем модель "многие к одной".
Многие ко многим Модель
Модель многие ко многим Модель мультиплексирует любое количество пользовательских потоков в равное или меньшее количество потоков ядра, сочетая лучшие функции моделей «один к одному» и «многие к одному».
Пользователи могут создавать любое количество потоков.
Блокирование системных вызовов ядра не блокирует весь процесс.
Процессы можно разделить между несколькими процессорами.
Что такое библиотеки потоков?
Библиотеки потоков предоставляют программистам API для создания потоков и управления ими.
Библиотеки потоков могут быть реализованы либо в пространстве пользователя, либо в пространстве ядра.Пользовательское пространство включает функции API, реализованные исключительно в пользовательском пространстве, без поддержки ядра. Пространство ядра включает системные вызовы и требует ядра с поддержкой библиотеки потоков.
Три типа резьбы
POSIX Pitheads может быть предоставлен как пользовательская библиотека или как библиотека ядра, как расширение стандарта POSIX.
потоков Win32 предоставляется как библиотека уровня ядра в системах Windows.
Потоки Java : Поскольку Java обычно работает на виртуальной машине Java, реализация потоков основана на любой ОС и оборудовании, на котором работает JVM, то есть потоки Pithead или Win32 в зависимости от системы.
Проблемы с многопоточностью
Ниже мы упомянули несколько проблем, связанных с многопоточностью. Что ж, старая поговорка: Все хорошее имеет свою цену.
Отмена потока
Отмена потока означает завершение потока до того, как он завершит работу.Для этого может быть два подхода: один - Асинхронная отмена , который немедленно завершает целевой поток. Другой - Отложенная отмена. позволяет целевому потоку периодически проверять, следует ли его отменить.
Обработка сигналов
Сигналы используются в системах UNIX для уведомления процесса о том, что произошло определенное событие. Теперь, когда многопоточный процесс получает сигнал, в какой поток он должен быть доставлен? Он может быть доставлен во все или в один поток.
fork () Системный вызов
fork () - это системный вызов, выполняемый в ядре, посредством которого процесс создает свою копию. Теперь проблема в многопоточном процессе: если один поток разветвляется, будет скопирован весь процесс или нет?
Проблемы безопасности
Да, могут возникнуть проблемы с безопасностью из-за обширного разделения ресурсов между несколькими потоками.
Есть много других проблем, с которыми вы можете столкнуться в многопоточном процессе, но для них есть подходящие решения.Выявление здесь некоторых проблем было просто для изучения обеих сторон медали.
.