figure:last-child { margin-bottom: 0.5rem; }
#write ol, #write ul { position: relative; }
img { max-width: 100%; vertical-align: middle; }
button, input, select, textarea { color: inherit; font: inherit; }
input[type="checkbox"], input[type="radio"] { line-height: normal; padding: 0px; }
*, ::after, ::before { box-sizing: border-box; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p, #write pre { width: inherit; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p { position: relative; }
p { line-height: inherit; }
h1, h2, h3, h4, h5, h6 { break-after: avoid-page; break-inside: avoid; orphans: 2; }
p { orphans: 4; }
h1 { font-size: 2rem; }
h2 { font-size: 1.8rem; }
h3 { font-size: 1.6rem; }
h4 { font-size: 1.4rem; }
h5 { font-size: 1.2rem; }
h6 { font-size: 1rem; }
.md-math-block, .md-rawblock, h1, h2, h3, h4, h5, h6, p { margin-top: 1rem; margin-bottom: 1rem; }
.hidden { display: none; }
.md-blockmeta { color: rgb(204, 204, 204); font-weight: 700; font-style: italic; }
a { cursor: pointer; }
sup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-radius: 4px; cursor: pointer; }
sup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inherit; text-decoration: inherit; }
#write input[type="checkbox"] { cursor: pointer; width: inherit; height: inherit; }
figure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; }
figure > table { margin: 0px !important; }
tr { break-inside: avoid; break-after: auto; }
thead { display: table-header-group; }
table { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; }
table.md-table td { min-width: 32px; }
.CodeMirror-gutters { border-right: 0px; background-color: inherit; }
.CodeMirror-linenumber { user-select: none; }
.CodeMirror { text-align: left; }
.CodeMirror-placeholder { opacity: 0.3; }
.CodeMirror pre { padding: 0px 4px; }
.CodeMirror-lines { padding: 0px; }
div.hr:focus { cursor: none; }
#write pre { white-space: pre-wrap; }
#write.fences-no-line-wrapping pre { white-space: pre; }
#write pre.ty-contain-cm { white-space: normal; }
.CodeMirror-gutters { margin-right: 4px; }
.md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background: inherit; position: relative !important; }
.md-diagram-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; }
#write .md-fences.mock-cm { white-space: pre-wrap; }
.md-fences.md-fences-with-lineno { padding-left: 0px; }
#write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; }
.md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; }
.CodeMirror-line, twitterwidget { break-inside: avoid; }
.footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; }
.footnotes + .footnotes { margin-top: 0px; }
.md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; background: 0px 0px; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; -webkit-tap-highlight-color: transparent; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; }
li div { padding-top: 0px; }
blockquote { margin: 1rem 0px; }
li .mathjax-block, li p { margin: 0.5rem 0px; }
li { margin: 0px; position: relative; }
blockquote > :last-child { margin-bottom: 0px; }
blockquote > :first-child, li > :first-child { margin-top: 0px; }
.footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; white-space: normal; }
#write .footnote-line { white-space: pre-wrap; }
@media print {
body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; }
#write { margin-top: 0px; padding-top: 0px; border-color: transparent !important; }
.typora-export * { -webkit-print-color-adjust: exact; }
html.blink-to-pdf { font-size: 13px; }
.typora-export #write { padding-left: 32px; padding-right: 32px; padding-bottom: 0px; break-after: avoid; }
.typora-export #write::after { height: 0px; }
}
.footnote-line { margin-top: 0.714em; font-size: 0.7em; }
a img, img a { cursor: pointer; }
pre.md-meta-block { font-size: 0.8rem; min-height: 0.8rem; white-space: pre-wrap; background: rgb(204, 204, 204); display: block; overflow-x: hidden; }
p > .md-image:only-child:not(.md-img-error) img, p > img:only-child { display: block; margin: auto; }
p > .md-image:only-child { display: inline-block; width: 100%; }
#write .MathJax_Display { margin: 0.8em 0px 0px; }
.md-math-block { width: 100%; }
.md-math-block:not(:empty)::after { display: none; }
[contenteditable="true"]:active, [contenteditable="true"]:focus { outline: 0px; box-shadow: none; }
.md-task-list-item { position: relative; list-style-type: none; }
.task-list-item.md-task-list-item { padding-left: 0px; }
.md-task-list-item > input { position: absolute; top: 0px; left: 0px; margin-left: -1.2em; margin-top: calc(1em - 10px); border: none; }
.math { font-size: 1rem; }
.md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-radius: 10px; }
.md-toc-content { position: relative; margin-left: 0px; }
.md-toc-content::after, .md-toc::after { display: none; }
.md-toc-item { display: block; color: rgb(65, 131, 196); }
.md-toc-item a { text-decoration: none; }
.md-toc-inner:hover { text-decoration: underline; }
.md-toc-inner { display: inline-block; cursor: pointer; }
.md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: 700; }
.md-toc-h2 .md-toc-inner { margin-left: 2em; }
.md-toc-h3 .md-toc-inner { margin-left: 4em; }
.md-toc-h4 .md-toc-inner { margin-left: 6em; }
.md-toc-h5 .md-toc-inner { margin-left: 8em; }
.md-toc-h6 .md-toc-inner { margin-left: 10em; }
@media screen and (max-width: 48em) {
.md-toc-h3 .md-toc-inner { margin-left: 3.5em; }
.md-toc-h4 .md-toc-inner { margin-left: 5em; }
.md-toc-h5 .md-toc-inner { margin-left: 6.5em; }
.md-toc-h6 .md-toc-inner { margin-left: 8em; }
}
a.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; }
.footnote-line a:not(.reversefootnote) { color: inherit; }
.md-attr { display: none; }
.md-fn-count::after { content: "."; }
code, pre, samp, tt { font-family: var(--monospace); }
kbd { margin: 0px 0.1em; padding: 0.1em 0.6em; font-size: 0.8em; color: rgb(36, 39, 41); background: rgb(255, 255, 255); border: 1px solid rgb(173, 179, 185); border-radius: 3px; box-shadow: rgba(12, 13, 14, 0.2) 0px 1px 0px, rgb(255, 255, 255) 0px 0px 0px 2px inset; white-space: nowrap; vertical-align: middle; }
.md-comment { color: rgb(162, 127, 3); opacity: 0.8; font-family: var(--monospace); }
code { text-align: left; vertical-align: initial; }
a.md-print-anchor { white-space: pre !important; border-width: initial !important; border-style: none !important; border-color: initial !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: 0px !important; background: 0px 0px !important; text-decoration: initial !important; text-shadow: initial !important; }
.md-inline-math .MathJax_SVG .noError { display: none !important; }
.html-for-mac .inline-math-svg .MathJax_SVG { vertical-align: 0.2px; }
.md-math-block .MathJax_SVG_Display { text-align: center; margin: 0px; position: relative; text-indent: 0px; max-width: none; max-height: none; min-height: 0px; min-width: 100%; width: auto; overflow-y: hidden; display: block !important; }
.MathJax_SVG_Display, .md-inline-math .MathJax_SVG_Display { width: auto; margin: inherit; display: inline-block !important; }
.MathJax_SVG .MJX-monospace { font-family: var(--monospace); }
.MathJax_SVG .MJX-sans-serif { font-family: sans-serif; }
.MathJax_SVG { display: inline; font-style: normal; font-weight: 400; line-height: normal; zoom: 90%; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; overflow-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; }
.MathJax_SVG * { transition: none 0s ease 0s; }
.MathJax_SVG_Display svg { vertical-align: middle !important; margin-bottom: 0px !important; margin-top: 0px !important; }
.os-windows.monocolor-emoji .md-emoji { font-family: "Segoe UI Symbol", sans-serif; }
.md-diagram-panel > svg { max-width: 100%; }
[lang="mermaid"] svg, [lang="flow"] svg { max-width: 100%; height: auto; }
[lang="mermaid"] .node text { font-size: 1rem; }
table tr th { border-bottom: 0px; }
video { max-width: 100%; display: block; margin: 0px auto; }
iframe { max-width: 100%; width: 100%; border: none; }
.highlight td, .highlight tr { border: 0px; }

.CodeMirror { height: auto; }
.CodeMirror.cm-s-inner { background: inherit; }
.CodeMirror-scroll { overflow: auto hidden; z-index: 3; }
.CodeMirror-gutter-filler, .CodeMirror-scrollbar-filler { background-color: rgb(255, 255, 255); }
.CodeMirror-gutters { border-right: 1px solid rgb(221, 221, 221); background: inherit; white-space: nowrap; }
.CodeMirror-linenumber { padding: 0px 3px 0px 5px; text-align: right; color: rgb(153, 153, 153); }
.cm-s-inner .cm-keyword { color: rgb(119, 0, 136); }
.cm-s-inner .cm-atom, .cm-s-inner.cm-atom { color: rgb(34, 17, 153); }
.cm-s-inner .cm-number { color: rgb(17, 102, 68); }
.cm-s-inner .cm-def { color: rgb(0, 0, 255); }
.cm-s-inner .cm-variable { color: rgb(0, 0, 0); }
.cm-s-inner .cm-variable-2 { color: rgb(0, 85, 170); }
.cm-s-inner .cm-variable-3 { color: rgb(0, 136, 85); }
.cm-s-inner .cm-string { color: rgb(170, 17, 17); }
.cm-s-inner .cm-property { color: rgb(0, 0, 0); }
.cm-s-inner .cm-operator { color: rgb(152, 26, 26); }
.cm-s-inner .cm-comment, .cm-s-inner.cm-comment { color: rgb(170, 85, 0); }
.cm-s-inner .cm-string-2 { color: rgb(255, 85, 0); }
.cm-s-inner .cm-meta { color: rgb(85, 85, 85); }
.cm-s-inner .cm-qualifier { color: rgb(85, 85, 85); }
.cm-s-inner .cm-builtin { color: rgb(51, 0, 170); }
.cm-s-inner .cm-bracket { color: rgb(153, 153, 119); }
.cm-s-inner .cm-tag { color: rgb(17, 119, 0); }
.cm-s-inner .cm-attribute { color: rgb(0, 0, 204); }
.cm-s-inner .cm-header, .cm-s-inner.cm-header { color: rgb(0, 0, 255); }
.cm-s-inner .cm-quote, .cm-s-inner.cm-quote { color: rgb(0, 153, 0); }
.cm-s-inner .cm-hr, .cm-s-inner.cm-hr { color: rgb(153, 153, 153); }
.cm-s-inner .cm-link, .cm-s-inner.cm-link { color: rgb(0, 0, 204); }
.cm-negative { color: rgb(221, 68, 68); }
.cm-positive { color: rgb(34, 153, 34); }
.cm-header, .cm-strong { font-weight: 700; }
.cm-del { text-decoration: line-through; }
.cm-em { font-style: italic; }
.cm-link { text-decoration: underline; }
.cm-error { color: red; }
.cm-invalidchar { color: red; }
.cm-constant { color: rgb(38, 139, 210); }
.cm-defined { color: rgb(181, 137, 0); }
div.CodeMirror span.CodeMirror-matchingbracket { color: rgb(0, 255, 0); }
div.CodeMirror span.CodeMirror-nonmatchingbracket { color: rgb(255, 34, 34); }
.cm-s-inner .CodeMirror-activeline-background { background: inherit; }
.CodeMirror { position: relative; overflow: hidden; }
.CodeMirror-scroll { height: 100%; outline: 0px; position: relative; box-sizing: content-box; background: inherit; }
.CodeMirror-sizer { position: relative; }
.CodeMirror-gutter-filler, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-vscrollbar { position: absolute; z-index: 6; display: none; }
.CodeMirror-vscrollbar { right: 0px; top: 0px; overflow: hidden; }
.CodeMirror-hscrollbar { bottom: 0px; left: 0px; overflow: hidden; }
.CodeMirror-scrollbar-filler { right: 0px; bottom: 0px; }
.CodeMirror-gutter-filler { left: 0px; bottom: 0px; }
.CodeMirror-gutters { position: absolute; left: 0px; top: 0px; padding-bottom: 30px; z-index: 3; }
.CodeMirror-gutter { white-space: normal; height: 100%; box-sizing: content-box; padding-bottom: 30px; margin-bottom: -32px; display: inline-block; }
.CodeMirror-gutter-wrapper { position: absolute; z-index: 4; background: 0px 0px !important; border: none !important; }
.CodeMirror-gutter-background { position: absolute; top: 0px; bottom: 0px; z-index: 4; }
.CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4; }
.CodeMirror-lines { cursor: text; }
.CodeMirror pre { border-radius: 0px; border-width: 0px; background: 0px 0px; font-family: inherit; font-size: inherit; margin: 0px; white-space: pre; overflow-wrap: normal; color: inherit; z-index: 2; position: relative; overflow: visible; }
.CodeMirror-wrap pre { overflow-wrap: break-word; white-space: pre-wrap; word-break: normal; }
.CodeMirror-code pre { border-right: 30px solid transparent; width: fit-content; }
.CodeMirror-wrap .CodeMirror-code pre { border-right: none; width: auto; }
.CodeMirror-linebackground { position: absolute; left: 0px; right: 0px; top: 0px; bottom: 0px; z-index: 0; }
.CodeMirror-linewidget { position: relative; z-index: 2; overflow: auto; }
.CodeMirror-wrap .CodeMirror-scroll { overflow-x: hidden; }
.CodeMirror-measure { position: absolute; width: 100%; height: 0px; overflow: hidden; visibility: hidden; }
.CodeMirror-measure pre { position: static; }
.CodeMirror div.CodeMirror-cursor { position: absolute; visibility: hidden; border-right: none; width: 0px; }
.CodeMirror div.CodeMirror-cursor { visibility: hidden; }
.CodeMirror-focused div.CodeMirror-cursor { visibility: inherit; }
.cm-searching { background: rgba(255, 255, 0, 0.4); }
@media print {
.CodeMirror div.CodeMirror-cursor { visibility: hidden; }
}

:root { --side-bar-bg-color: #fafafa; --control-text-color: #777; }
html { font-size: 16px; }
body { font-family: "Open Sans", "Clear Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; color: rgb(51, 51, 51); line-height: 1.6; }
#write { max-width: 860px; margin: 0px auto; padding: 30px 30px 100px; }
#write > ul:first-child, #write > ol:first-child { margin-top: 30px; }
a { color: rgb(65, 131, 196); }
h1, h2, h3, h4, h5, h6 { position: relative; margin-top: 1rem; margin-bottom: 1rem; font-weight: bold; line-height: 1.4; cursor: text; }
h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor { text-decoration: none; }
h1 tt, h1 code { font-size: inherit; }
h2 tt, h2 code { font-size: inherit; }
h3 tt, h3 code { font-size: inherit; }
h4 tt, h4 code { font-size: inherit; }
h5 tt, h5 code { font-size: inherit; }
h6 tt, h6 code { font-size: inherit; }
h1 { padding-bottom: 0.3em; font-size: 2.25em; line-height: 1.2; border-bottom: 1px solid rgb(238, 238, 238); }
h2 { padding-bottom: 0.3em; font-size: 1.75em; line-height: 1.225; border-bottom: 1px solid rgb(238, 238, 238); }
h3 { font-size: 1.5em; line-height: 1.43; }
h4 { font-size: 1.25em; }
h5 { font-size: 1em; }
h6 { font-size: 1em; color: rgb(119, 119, 119); }
p, blockquote, ul, ol, dl, table { margin: 0.8em 0px; }
li > ol, li > ul { margin: 0px; }
hr { height: 2px; padding: 0px; margin: 16px 0px; background-color: rgb(231, 231, 231); border: 0px none; overflow: hidden; box-sizing: content-box; }
li p.first { display: inline-block; }
ul, ol { padding-left: 30px; }
ul:first-child, ol:first-child { margin-top: 0px; }
ul:last-child, ol:last-child { margin-bottom: 0px; }
blockquote { border-left: 4px solid rgb(223, 226, 229); padding: 0px 15px; color: rgb(119, 119, 119); }
blockquote blockquote { padding-right: 0px; }
table { padding: 0px; word-break: initial; }
table tr { border-top: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px; }
table tr:nth-child(2n), thead { background-color: rgb(248, 248, 248); }
table tr th { font-weight: bold; border-width: 1px 1px 0px; border-top-style: solid; border-right-style: solid; border-left-style: solid; border-top-color: rgb(223, 226, 229); border-right-color: rgb(223, 226, 229); border-left-color: rgb(223, 226, 229); border-image: initial; border-bottom-style: initial; border-bottom-color: initial; margin: 0px; padding: 6px 13px; }
table tr td { border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 6px 13px; }
table tr th:first-child, table tr td:first-child { margin-top: 0px; }
table tr th:last-child, table tr td:last-child { margin-bottom: 0px; }
.CodeMirror-lines { padding-left: 4px; }
.code-tooltip { box-shadow: rgba(0, 28, 36, 0.3) 0px 1px 1px 0px; border-top: 1px solid rgb(238, 242, 242); }
.md-fences, code, tt { border: 1px solid rgb(231, 234, 237); background-color: rgb(248, 248, 248); border-radius: 3px; padding: 2px 4px 0px; font-size: 0.9em; }
code { background-color: rgb(243, 244, 244); padding: 0px 2px; }
.md-fences { margin-bottom: 15px; margin-top: 15px; padding-top: 8px; padding-bottom: 6px; }
.md-task-list-item > input { margin-left: -1.3em; }
@media print {
html { font-size: 13px; }
table, pre { break-inside: avoid; }
pre { overflow-wrap: break-word; }
}
.md-fences { background-color: rgb(248, 248, 248); }
#write pre.md-meta-block { padding: 1rem; font-size: 85%; line-height: 1.45; background-color: rgb(247, 247, 247); border: 0px; border-radius: 3px; color: rgb(119, 119, 119); margin-top: 0px !important; }
.mathjax-block > .code-tooltip { bottom: 0.375rem; }
.md-mathjax-midline { background: rgb(250, 250, 250); }
#write > h3.md-focus::before { left: -1.5625rem; top: 0.375rem; }
#write > h4.md-focus::before { left: -1.5625rem; top: 0.285714rem; }
#write > h5.md-focus::before { left: -1.5625rem; top: 0.285714rem; }
#write > h6.md-focus::before { left: -1.5625rem; top: 0.285714rem; }
.md-image > .md-meta { border-radius: 3px; padding: 2px 0px 0px 4px; font-size: 0.9em; color: inherit; }
.md-tag { color: rgb(167, 167, 167); opacity: 1; }
.md-toc { margin-top: 20px; padding-bottom: 20px; }
.sidebar-tabs { border-bottom: none; }
#typora-quick-open { border: 1px solid rgb(221, 221, 221); background-color: rgb(248, 248, 248); }
#typora-quick-open-item { background-color: rgb(250, 250, 250); border-color: rgb(254, 254, 254) rgb(229, 229, 229) rgb(229, 229, 229) rgb(238, 238, 238); border-style: solid; border-width: 1px; }
.on-focus-mode blockquote { border-left-color: rgba(85, 85, 85, 0.12); }
header, .context-menu, .megamenu-content, footer { font-family: "Segoe UI", Arial, sans-serif; }
.file-node-content:hover .file-node-icon, .file-node-content:hover .file-node-open-state { visibility: visible; }
.mac-seamless-mode #typora-sidebar { background-color: var(--side-bar-bg-color); }
.md-lang { color: rgb(180, 101, 77); }
.html-for-mac .context-menu { --item-hover-bg-color: #E6F0FE; }
#md-notification .btn { border: 0px; }
.dropdown-menu .divider { border-color: rgb(229, 229, 229); }
.ty-preferences .window-content { background-color: rgb(250, 250, 250); }
.ty-preferences .nav-group-item.active { color: white; background: rgb(153, 153, 153); }
-->

Python学习day36-并发编程(2)

Process的一些常用方法和属性

join

join的主要用法是在于可以让主进程等待子进程运行完后,再执行下面的语句.要注意的一点是,主进程在等待,但是子进程在正常运行.

下面是join一些简单用法,包括串行,并行以及并行的优化

 
 
 
xxxxxxxxxx
118
 
 
 
 
1
from multiprocessing import Process
2
import time
3
4
def foo():
5
print('进程start')
6
time.sleep(2)
7
print('进程end')
8
if __name__ == '__main__':
9
p = Process(target=foo)
10
p.start()
11
time.sleep(5)
12
p.join()  # 要等待该子进程全部执行完才会继续向下运行,主进程在等待,子进程在运行,内部会调用wait(),回收其子进程的pid号
13
print('主')
14
    
15
    
16
# 输出结果为:
17
# 进程start
18
# 进程end
19
# 主
20
21
22
23
# 串行,开辟内存空间要多费时间
24
def foo(x):
25
print(f'{x}进程start')
26
time.sleep(x)
27
print(f'{x}进程end')
28
if __name__ == '__main__':
29
p = Process(target=foo, args=(3,))
30
p2 = Process(target=foo, args=(2,))
31
p3 = Process(target=foo, args=(1,))
32
start = time.time()
33
p.start()
34
p.join()
35
p2.start()
36
p2.join()
37
p3.start()
38
p3.join()
39
# time.sleep(5)
40
end = time.time()
41
print(f'{end-start}')
42
print('主')
43
# 结果为:
44
# 3进程start
45
# 3进程end
46
# 2进程start
47
# 2进程end
48
# 1进程start
49
# 1进程end
50
# 6.7584381103515625这个时间不是绝对的,会根据所在机器的性能变化
51
# 主
52
53
54
55
# 并行,真正的同时运行
56
def foo(x):
57
print(f'{x}进程start')
58
time.sleep(x)
59
print(f'{x}进程end')
60
if __name__ == '__main__':
61
p = Process(target=foo, args=(10,))
62
p2 = Process(target=foo, args=(2,))
63
p3 = Process(target=foo, args=(1,))
64
start = time.time()
65
p.start()
66
p2.start()
67
p3.start()
68
# time.sleep(5)
69
p.join()  
70
p2.join()
71
p3.join()
72
end = time.time()
73
print(f'{end-start}')
74
print('主')
75
76
# 结果为:
77
# 2进程start
78
# 3进程start
79
# 1进程start
80
# 1进程end
81
# 2进程end
82
# 3进程end
83
# 3.3003978729248047
84
# 主
85
86
87
# 上述这种并行的发生看起来非常的麻烦,所以我们其实可以用一个循环把下面重复性的创建进程以及join暂停进程都放到循环里,简化代码.
88
# 并行的优化
89
90
def foo(x):
91
print(f'{x}进程start')
92
time.sleep(x)
93
print(f'{x}进程end')
94
95
96
if __name__ == '__main__':
97
start = time.time()
98
p_list = []# 创建一个p_list列表用来接收创建的子进程
99
for i in range(1, 4):
100
p = Process(target=foo, args=(i,))
101
p.start()
102
p_list.append(p)
103
for p in p_list:#将列表里的子进程一一拿出来循环,然后通过join分别暂停主进程,从而达到并行的目的
104
p.join()
105
end = time.time()
106
print(end - start)
107
print('主')
108
    
109
    
110
# 结果为:
111
# 2进程start
112
# 1进程start
113
# 3进程start
114
# 1进程end
115
# 2进程end
116
# 3进程end
117
# 3.275794744491577
118
# 主
 
 

获取当前进程pid和父进程pid

获取当前进程pid的常用方式有两种,分别是:

os.getpid(),这是os模块所带有的方法,可以查看当前进程的pid号

os.getppid(),注意这里是ppid,多了一个p,是查看当前进程的父进程的pid号

子进程对象.pid

 
 
 
xxxxxxxxxx
30
 
 
 
 
1
from multiprocessing import Process, current_process  # 获取当前进程的对象
2
3
import time, os
4
5
6
def task():
7
print('子进程start')
8
print('在子进程中查看自身的pid', current_process().pid)
9
print('在子进程中查看自身的pid', os.getpid())
10
print('在子进程中查看父进程的pid', os.getppid())
11
time.sleep(200)
12
print('子进程end')
13
14
15
if __name__ == '__main__':
16
p = Process(target=task)
17
p.start()
18
print('在主进程查看子进程的pid', p.pid)  # 一定写在子进程启动之后,即start之后
19
print('主进程pid', os.getpid())
20
print('主')
21
    
22
    
23
# 运行结果为:(这里pid每次执行都是不一样的,都是重新分配的)
24
# 在主进程查看子进程的pid 9964
25
# 主进程pid 11584
26
# 主
27
# 子进程start
28
# 在子进程中查看自身的pid 9964
29
# 在子进程中查看自身的pid 9964
30
# 在子进程中查看父进程的pid 11584
 
 

name和is_alive

name() 进程名称,可以手动定义

is_alive() 判断进程是否还存在,只要运行完了就返回false,即便是僵尸进程也是false

 
 
 
xxxxxxxxxx
31
 
 
 
 
1
from multiprocessing import Process, current_process
2
import time
3
4
5
def foo():
6
print('进程start')
7
print(current_process().name)
8
time.sleep(2)
9
print('进程end')
10
11
12
if __name__ == '__main__':
13
p = Process(target=foo, name='nick')
14
# p2 = Process(target=foo, name='jack')
15
# p3 = Process(target=foo, name='mata')
16
p.start()
17
# p2.start()
18
# p3.start()
19
print(p.is_alive())# 判定进程是否还活着,返回值是True活着False
20
print(p.name)# 输出进程的名字,也可以是自身赋予的值,如果自己没有赋值系统默认的就是Process-数字
21
# print(p2.name)
22
# print(p3.name)
23
24
    
25
# 结果是:
26
# True
27
# nick
28
# 进程start
29
# nick
30
# 进程end
31
 
 

terminate

手动结束子进程,但其实只是给操作系统发送了一个关闭进程的请求,需要时间才能完成,推荐在后面加上p.join()来实时判断进程是否已经结束了,也就是说进程只有执行完了才会进行下面的语句.

 
 
 
xxxxxxxxxx
18
 
 
 
 
1
from multiprocessing import Process, current_process
2
import time
3
4
5
def foo():
6
print('进程start')
7
print(current_process().name)
8
time.sleep(2)
9
print('进程end')
10
11
12
if __name__ == '__main__':
13
p = Process(target=foo, name='nick')
14
p.start()
15
p.terminate()
16
# p.join()
17
print(p.is_alive())
18
# print(p.name)
 
 

daemon

守护进程(本质就是一个子进程)

  1. 守护进程会在父进程结束之后就随之结束(实际上父进程代码执行完了守护进程就会结束,而不是父进程完全结束)
  2. 守护进程不能创建子进程
 
 
 
x
 
 
 
 
1
from multiprocessing import Process, current_process
2
import time
3
4
5
def foo():
6
print('守护进程start', time.time())
7
time.sleep(3)
8
print('守护进程end', time.time())
9
10
11
def task():
12
print('子进程start', time.time())
13
time.sleep(5)
14
print('子进程end', time.time())
15
16
17
if __name__ == '__main__':
18
p = Process(target=foo, name='nick')
19
p2 = Process(target=task, name='nick')
20
p.daemon = True  # 定义为守护进程,必须要在start之前定义
21
p.start()
22
p2.start()
23
time.sleep(2)
24
print('主', time.time())
25
# 结果为:
26
# 守护进程start 1568278460.6168563
27
# 子进程start 1568278460.6188455
28
# 主 1568278462.376258
29
# 子进程end 1568278465.6189692
30
31
32
# 可以看到上述例程的结果里没有守护进程结束的输出语句,因为父进程已经结束了,所以守护进程跟随父进程结束了,后面的就没有打印.
 
 

Tips:抢票软件的原理

先来语言分析一波,抢票的总体流程是怎样的,12306的数据库里肯定有实时的票数以及票价,我们购买的时候呢,就要发一个请求,包括查询和购买都要发请求,然后12306的服务器给我们返回数据库里的票数,可是我们都知道,网络是有延迟的,数据传输也是需要时间的,所以很可能同时有很多人,同时查询这个车次的票,然后得到还有一张票的消息(比如),然后这些人都点击购买,那么12306会把这个票给哪个用户呢?

其实这种情况下我们如果用并行进程的概念是行不通的,因为延迟的情况下就有可能很多人都买到了这张票,可是实际情况是不可能的,所以这里为了数据的安全以及逻辑的缜密,我们就要牺牲效率,转而用串行的方法来处理这个事情,尽管效率会慢很多,但是不会出现一张票同时卖给很多人的情况.也就是说用join方法来实现串行.

例程如下:

 
 
 
x
 
 
1
# 这里我们需要在文件的同目录创建一个db.txt文件
2
# 在文件里写{"count": 1}
3
from multiprocessing import Process, current_process
4
import time
5
import json
6
import os
7
8
9
def search():
10
    time.sleep(1)  # 模拟网络io
11
    with open('db.txt', 'rt', encoding='utf-8')as f:
12
        res = json.load(f)
13
        print(f'还剩{res["count"]}张票')
14
15
16
def get():
17
    with open('db.txt', 'rt', encoding='utf-8')as f:
18
        res = json.load(f)
19
        print(f'还剩{res["count"]}张票')
20
    time.sleep(1)  # 模拟网络io
21
    if res['count'] > 0:
22
        res['count'] -= 1
23
        with open('db.txt', 'wt', encoding='utf-8')as f:
24
            json.dump(res, f)
25
            f.flush()
26
            print(f'{os.getpid()}抢票成功')
27
            time.sleep(1)  # 模拟网络io
28
29
    else:
30
        print('票已经售空!~!~!~!~!~!~!~!')
31
    # current_process().terminate()
32
33
 
 
34
def task():
35
    #search()
36
    get()
37
38
39
if __name__ == '__main__':
40
    for i in range(5):
41
        p = Process(target=task)
42
        p.start()
43
        p.join()
44
# 输出结果为:
45
# 还剩1张票
46
# 11576抢票成功
47
# 还剩0张票
48
# 票已经售空!~!~!~!~!~!~!~!
49
# 还剩0张票
50
# 票已经售空!~!~!~!~!~!~!~!
51
# 还剩0张票
52
# 票已经售空!~!~!~!~!~!~!~!
53
# 还剩0张票
54
# 票已经售空!~!~!~!~!~!~!~!
55
 
 

当然实际的抢票软件肯定做了更多的优化,不会这么简单,但是大概逻辑是差不多的.

最新文章

  1. PHP如何将session保存到memcached中?如何分布式保存PHP session
  2. 【MyEclipse 2015】 逆向破解实录系列【1】(纯研究)
  3. VMware 安装CentOS
  4. Delphi的内存管理及内存泄露问题 FastMM4
  5. 使用maven 命令运行项目
  6. mysqldump备份与还原mysql数据的实例
  7. gdb在Mac上的安装步骤
  8. ACM俱乐部算法基础练习赛(1)
  9. JavaScript忍者秘籍——函数(上)
  10. JSON对象操作
  11. Recall(召回率)and Precision(精确率)
  12. 数据故障的恢复-MSSQL ndf文件大小变为0 KB恢复过程
  13. geth常用指令
  14. CentOS 7安装OpenCV 3.3.1
  15. Scrapy中选择器的用法
  16. 拦截器的使用,配置手机浏览器访问的h5页面
  17. 将.db文件导入SQLServer2008数据库
  18. 漫谈数据仓库之拉链表(原理、设计以及在Hive中的实现)
  19. OC 内存管理之手动内存管理MRC
  20. Win10系统创建关机快捷方式和快捷键的方法,实现一键关机

热门文章

  1. JS事件 文本框内容改变事件(onchange)通过改变文本框的内容来触发onchange事件,同时执行被调用的程序。
  2. openwrt_ipsec_function.sh 分析
  3. gradle 随记
  4. Nlog 日志框架简单教程
  5. CSS案例3(在线教育网站)
  6. 如何HOOK桌面窗口消息
  7. 如何用excel统计调查问卷
  8. AtCoder ABC 129E Sum Equals Xor
  9. 区间dp及优化
  10. 9.2 sun.py