前言:
此时各位老铁们对“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指纹多线程登录