-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathPython-进程、线程、协成.html
178 lines (169 loc) · 7.07 KB
/
Python-进程、线程、协成.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>商伟的技术博客</title>
<meta name="description" content="">
<meta name="author" content="商伟">
<!-- HTML5 shim, for IE6-8 support of HTML elements -->
<!--[if lt IE 9]>
<script src="/theme/html5.js"></script>
<![endif]-->
<!-- Styles -->
<link href="/theme/bootstrap.min.css" rel="stylesheet">
<link href="/theme/local.css" rel="stylesheet">
<link href="/theme/pygments.css" rel="stylesheet">
<!-- Feeds -->
</head>
<body>
<div class="topbar">
<div class="topbar-inner">
<div class="container-fluid">
<a class="brand" href="/">商伟的技术博客</a>
<ul class="nav">
<li ><a href="/category/django.html">Django</a></li>
<li ><a href="/category/docker.html">Docker</a></li>
<li ><a href="/category/git.html">GIT</a></li>
<li ><a href="/category/javascript.html">JavaScript</a></li>
<li ><a href="/category/mongodb.html">Mongodb</a></li>
<li ><a href="/category/mysql.html">MySQL</a></li>
<li ><a href="/category/pa-chong.html">爬虫</a></li>
<li class="active"><a href="/category/python.html">Python</a></li>
<li ><a href="/category/rabbitmq.html">RabbitMQ</a></li>
<li ><a href="/category/redis.html">redis</a></li>
<li ><a href="/category/shu-ju-jie-gou.html">数据结构</a></li>
<li ><a href="/category/sui-shou-bi-ji.html">随手笔记</a></li>
<li ><a href="/category/supervisor.html">Supervisor</a></li>
<li ><a href="/category/vue.html">VUE</a></li>
<li ><a href="/category/wang-luo.html">网络</a></li>
<li ><a href="/category/web.html">web</a></li>
<li ><a href="/category/xiao-cheng-xu.html">小程序</a></li>
<li ><a href="/category/xu-ni-huan-jing.html">虚拟环境</a></li>
</ul>
<p class="pull-right"><a href="/archives.html">[archives]</a> <a href="/tags.html">[tags]</a></p>
</div>
</div>
</div>
<div class="container-fluid">
<div class="sidebar">
<div class="well">
<h3>Blogroll</h3>
<ul>
<li><a href="http://getpelican.com/">Pelican</a></li>
<li><a href="http://python.org/">Python.org</a></li>
<li><a href="http://jinja.pocoo.org/">Jinja2</a></li>
</ul>
<div class="social">
<h3>Social</h3>
<ul>
<li><a href="https://lienze.tech/">老渔夫吃虾米</a></li>
</ul>
</div>
</div>
</div>
<div class="content">
<div class='article'>
<div class="page-header"><h1>Python-进程、线程、协成</h1></div>
<div class="well small">Permalink: <a class="more" href="/Python-进程、线程、协成.html">2020-05-17 22:01:00+02:00</a>
by <a class="url fn" href="/author/shang-wei.html">商伟 </a>
in <a href="/category/python.html">Python</a>
tags: <a href="/tag/python.html">Python</a> </div>
<div><h2>1.进程</h2>
<ul>
<li>
<p>进程</p>
</li>
<li>
<p><strong>进程是资源分配的最小单位( 内存、cpu、网络、io)</strong></p>
</li>
<li><strong>一个运行起来的程序就是一个进程</strong><ul>
<li>什么是程序(程序是我们存储在硬盘里的代码)</li>
<li>硬盘(256G)、内存条(8G)</li>
<li>当我们双击图标,打开程序的时候,实际上就是通过I/O操作(读写)内存条里面</li>
<li>内存条就是我们所指的资源</li>
<li>CPU分时</li>
<li>CPU比你的手速快多了,分时处理每个线程,但是由于太快然你觉得每个线程都是独占cpu</li>
<li>cpu是计算,只有时间片到了,获取cpu,线程真正执行</li>
<li>当你想使用 网络、磁盘等资源的时候,需要cpu的调度</li>
</ul>
</li>
<li><strong>进程具有独立的内存空间,所以没有办法相互通信</strong><ul>
<li>进程如何通信</li>
<li>进程queue(父子进程通信)</li>
<li>pipe(同一程序下两个进程通信)</li>
<li>managers(同一程序下多个进程通信)</li>
<li>RabbitMQ、redis等(不同程序间通信)</li>
</ul>
</li>
<li>为什么需要进程池<ul>
<li>一次性开启指定数量的进程</li>
<li>如果有十个进程,有一百个任务,一次可以处理多少个(一次性只能处理十个)</li>
<li>防止进程开启数量过多导致服务器压力过大</li>
</ul>
</li>
</ul>
<h2>2.线程</h2>
<ul>
<li>有了进程为什么还需要线程</li>
<li>因为进程不能同一时间只能做一个事情</li>
<li>什么是线程</li>
<li>线程是操作系统调度的最小单位</li>
<li>线程是进程正真的执行者,是一些指令的集合(进程资源的拥有者)</li>
<li>同一个进程下的读多个<strong>线程共享内存空间</strong>,数据直接访问(数据共享)</li>
<li>为了保证数据安全,必须使用<strong>线程锁</strong></li>
<li>GIL全局解释器锁</li>
<li>在python全局解释器下,保证同一时间只有一个线程运行</li>
<li>防止多个线程都修改数据</li>
<li>线程锁(互斥锁)</li>
<li>GIL锁只能保证同一时间只能有一个线程对某个资源操作,但当上一个线程还未执行完毕时可能就会释放GIL,其他线程就可以操作了</li>
<li>线程锁本质把线程中的数据加了一把互斥锁<ul>
<li>mysql中共享锁 & 互斥锁</li>
<li>mysql共享锁:共享锁,所有线程都能读,而不能写</li>
<li>mysql排它锁:排它,任何线程读取这个这个数据的权利都没有</li>
<li>加上线程锁之后所有其他线程,读都不能读这个数据</li>
</ul>
</li>
<li>有了GIL全局解释器锁为什么还需要线程锁<ul>
<li>因为cpu是分时使用的</li>
</ul>
</li>
<li><strong>死锁定义</strong></li>
<li>两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去</li>
</ul>
<h2>3.协程</h2>
<ul>
<li>什么是协程</li>
<li>协程微线程,纤程,本质是一个单线程</li>
<li>协程能在单线程处理高并发<ul>
<li>线程遇到I/O操作会等待、阻塞,协程遇到I/O会自动切换(剩下的只有CPU操作)</li>
<li>线程的状态保存在CPU的寄存器和栈里而协程拥有自己的空间,所以无需上下文切换的开销,所以快、</li>
</ul>
</li>
<li>为甚么协程能够遇到I/O自动切换<ul>
<li>协程有一个gevent模块(封装了greenlet模块),遇到I/O自动切换</li>
</ul>
</li>
<li>协程缺点</li>
<li>无法利用多核资源:<strong>协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上</strong>,协程需要和进程配合才能运行在多CPU上</li>
<li>
<p><strong>线程阻塞(Blocking)操作(如IO时)会阻塞掉整个程序</strong></p>
</li>
<li>
<p>协程最大的优点</p>
</li>
<li>不仅是处理高并发(单线程下处理高并发)</li>
<li>特别节省资源(500日活,用php写需要两百多态机器,但是golang只需要二十多太机器)<ul>
<li>200多台机器一年</li>
<li>二十多天机器一年</li>
</ul>
</li>
</ul></div>
</div>
<footer>
<p>Powered by <a href="http://getpelican.com/">Pelican</a>. Theme based on <a href="http://twitter.github.com/bootstrap/">Twitter Bootstrap</a>.</p>
<p>© 商伟</p>
</footer>
</div>
</div>
</body>
</html>