龙空技术网

python多进程多线程 day04

小悦 182

前言:

此时各位老铁们对“python假死”大致比较着重,小伙伴们都想要分析一些“python假死”的相关内容。那么小编在网络上搜集了一些关于“python假死””的相关内容,希望同学们能喜欢,兄弟们一起来了解一下吧!

思考题:

有1000个一模一样的瓶子,其中有999个瓶子里面装的是

普通的水,有一瓶装的是透明无色无味的毒药。

任何喝下毒药的生物在一周之后会死亡。

现在的条件是:你有10只小白鼠和一周的时间,

怎么找出这瓶毒药。

首先对1000个瓶子编号:

1,2, 3, 4,..., 10000

1: 0000000001 m1喝 m2不喝...

2: 0000000010 m1不喝 m2喝...

3: 0000000011 m1喝 m2喝...

4: 0000000100 m1不喝 m2不喝...

...

856: 1101011000 m1不喝 m2不喝...

...

1000:1111101000 m1不喝 m2不喝...

m1 让编号为m1的老鼠去喝所有

二进制右起第一位是1的瓶子;

m2

m3

m4

m5

m6

m7

m8

m9

m10

对小白鼠进行编号:

m1, m2, m3, ..., m10

-----------------------

线程:

进程(Process)与线程(Thread):

进程:程序加载运行的一次抽象;

***进程是操作系统分配资源的单位;

线程:线程是操作系统执行流程的分配单位,

***是分配时间片的单位;

一个进程中至少有一个线程;

线程本质上就是一种轻量级的进程;

threading.Thread:

Thread(target=None, args=None)

start() 开启执行流程就绪状态;

run()

join() 等待线程执行完毕;

is_alive() 看线程是否还在工作;

name 线程的名字;

ident 线程id;

daemon 是否是守护线程;

****multiThreadingTimer.py****

从进程向线程过渡时,需要做:

1)把进程替换成线程(multiprocessing.Process

替换成threading.Thread);

2)在多线程程的包中找到对应于多进程进程间通信的模块,

进行替换;

3)大部分的方法和执行逻辑几乎不需要做任何改动;

****ProducerAndConsumerInQueueInThreads.py

****bankDeposit2Threads.py

什么死锁?怎么解决死锁?

多个执行流程,多个资源,并且执行流程需要获取

这多个资源的情况下。有可能会出现某些执行流程各获取

一部分资源,从而导致多个执行流程进入假死的等待状态。

著名的哲学家进餐问题就是一个典型的死锁问题;

可能的解决方案:

A.避免互斥:使用信号量;缺点:和资源的特性有关;

B.请求与保持条件:当一个线程因为请求资源而阻塞时,

该放手时就放手;比如说:Queue get(block=True,

timeout=None) 缺点:效率低;

C.占有资源原子性:保证资源获取的原子性,

要不都不取,要不都拿到;缺点:效率低,

会要取可能不需要的资源;

D.保证资源获取的有序性;缺点:和C类似,

效率不高;

Python中线程的问题:

GIL(Global Interpreter Lock)全局解释锁;

多线程在真正运行时仍然是一种单线程;

-----------

我们所说的Python实际上是CPython(C语言),

Python语言其实只是一种标准,怎么实现可以由其他

语言自己根据标准来自己实现;我们所说Python

是Python之父用C语言实现的;

当时的背景是多核还不流行的单核时代,Threading

就在这种背景下产生了,所以当时Threading并没有

考虑现在的并行编程的效率,而只是考虑在并发情况下

的执行;

全局解释锁实际上是在Python的解释器中添加了一把

全局的锁,

Jython(Java),Ironthon(.net), Pypy(python)

做一件事总结:

0)单进程;

1)多线程;

2)线程池;

3)多进程;

4)进程池;

****总结:

什么时候用多进程,什么时候用多线程?

1)使用多进程的场景:计算密集型的场景;

体会计算密集型的场景:ideone_j8bR2b.py

比如:密码破解,图形图像处理,数据分析等等;

2)使用多线程的场景:I/O密集型的场景;

比如:下载文件,网络爬虫,数据库操作等;

补充说明:

协程:轻量级的线程,适合I/O密集型的场景;

前不久,美国有个著名的电视节目Monty hall:

主持人说:我这有3扇门A,B,C,其中有两扇

门后面放的是一只羊,还有一扇门后面放了一辆汽车;

嘉宾选了A门;在嘉宾选完了之后,主持人走到了

B,C中放羊的一扇门那,比如B,打开了B门;

问嘉宾是否改选?

不改变你的选择,1/3;

改变你的选择,2/3;

---------------作业----------------

1)实现面向对象线程版本的定时器;

2)写一个程序,用双进程跑满双核,并且截图;

3)大作业:

把一个文件夹下面至少1000个文件拷贝到另一个

文件夹下面,使用多进程(多线程,进程池,线程池)

的方式。

# 如果在multiprocessing.Pool()要用队列进行

#进程之间的通信,请使用:

#multiprocessing.Manager().Queue()

怎么证明你拷贝的文件没有问题;

什么是哈希?**hashTest.py

给一段信息做指纹;

指纹是唯一的,没有碰撞;

标签: #python假死 #python指纹多线程登录