深入理解Python多线程 多进程 协程----(多线程)

1 什么是线程

在操作系统中,每个进程都有一个地址空间,而且默认有一个控制线程

进程是资源单位,线程是执行单位

进程只是用来把资源集中到一起,线程是CPU上的执行单位

2 线程的开销小

如果我们的软件是一个工厂,该工厂有多条流水线,流水线工作需要电源,电源只有一个即cpu(单核cpu)

一个车间就是一个进程,一个车间至少一条流水线(一个进程至少一个线程)

创建一个进程,就是创建一个车间(申请空间,在该空间内建至少一条流水线)

而建线程,就只是在一个车间内造一条流水线,无需申请空间,所以创建开销小

进程之间是竞争关系,线程之间是协作关系:

http://www.cnblogs.com/linhaifeng/articles/7430082.html

3 为什么用多线程

  • 多线程共享一个进程的地址空间
  • 线程比进程更轻量级 更容易创建 可撤销,创建线程比创建进程快10-100倍,在有大量线程需要动态和快速修改时,这一特性很有用
  • 在CPU系统中,为了利用多核,可以开启多个线程,比开进程开销的小

不同进程之间的关系是竞争关系,抢占CPU,同一进程内的线程是合作关系,一个线程可以访问另一个线程的内存。

多线程的设计时有难度的。
 1. 父进程有多个线程,那么开启的子线程是否需要同样多的线程

   如果是,那么附近中某个线程被阻塞,那么copy到子进程后,copy版的线程也要被阻塞吗,想一想nginx的多线程模式接收用户连接。

  2. 在同一个进程中,如果一个线程关闭了问题,而另外一个线程正准备往该文件内写内容呢?

如果一个线程注意到没有内存了,并开始分配更多的内存,在工作一半时,发生线程切换,新的线程也发现内存不够用了,又开始分配更多的内存,这样内存就被分配了多次,这些问题都是多线程编程的典型问题,需要仔细思考和设计。

4 threading模块

multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性

4.1 开启线程的两种昂方式

方式一:

1
2
3
4
5
6
7
8
9
10
11
12
from threading import Thread
import time
def foo(name):
time.sleep(2)
print("%s say hello"%name)
if __name__ == '__main__':
t = Thread(target=foo,args=('aaa',))
t.start()
print('主线程')

方式二:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from threading import Thread
import time
class Sayhi(Thread):
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
time.sleep(2)
print("%s say hello" % self.name)
if __name__ == '__main__':
t = Sayhi('bbb')
t.start()
print('主线程')

5 在一个进程下开启多个线程与在一个进程下开启多个子进程的区别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from threading import Thread
from multiprocessing import Process
import os
def work():
print('hello')
if __name__ == '__main__':
# 在主进程下开启线程
t = Thread(target=work) # 会先执行work 然后打印
t.start()
print('主线程/主进程')
# 在主进程下开启子进程
p = Process(target=work)
p.start()
print('主线程/主进程') # 先打印

结果:
hello
主线程/主进程
主线程/主进程
hello

参考:
http://www.cnblogs.com/linhaifeng/articles/7430082.html

© 2018 Peter's Blog Center All Rights Reserved.
Theme by hiero