最近看了一下《python并行编程手册》,虽然这本书薄薄的,包含内容挺多,但是有很多地方讲的不清楚,而且有一些bug出现,讲道理不推荐看这本书,但是我也随手翻完了,代码也写着玩,总结一下python并行编程,顺便写一写书里有问题的地方。这本书的问题过多,不建议阅读!!!尤其是mpi4py之后的内容。。。。。。(弃坑)
python线程模块
threading是python标准库的线程模块,可以利用threading进行直接创建线程,或者新建一个类继承threading类,下面是书上这两种方式的实现代码:
import threading
def func(i,j):
print ("function called by thread %i %\n" %(i,j))
threads = []
for i in range(5):
#这里我添加了一个参数,传递两个参数
t = threading.Thread(target = func,args = (i,i+1))#新建线程对象
threads.append(t) #添加到队列中
t.start() # 开始线程
t.join()#使主线程等待子线程完成
import threading
import time
exitFlag = 0 #该程序中没有太大作用
class myThread(threading.Thread):
def __init__(self,threadID,name,counter):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.counter = counter
def run(self):
print ("Threading " + self.name + " Start")
print_time(self.name,self.counter,5)
print ("Exiting " + self.name)
def print_time(threadName,delay,counter):
while counter:
if exitFlag:
thread.exit()
time.sleep(delay)
print ("%s: %s"%(threadName,time.ctime(time.time())))
counter-=1
Thread1 = myThread(1,"Thread-1",1)
Thread2 = myThread(2,"Thread-2",2)
Thread1.start()
Thread2.start()
Thread1.join()#书上并有进行join,所以下面这一行话会在
Thread2.join()#程序一开始就弹出,之后才是两个线程的输出内容
print ("Exiting Main Thread")
竞态条件
当并发线程的两个或多个操作尝试访问共享内存,并且至少有一个操作想要修改数据的状态时没有适当的同步机制,就会导致竞态条件。解决竞态条件的最简单方法就是使用锁机制。
线程A访问资源a的时候,就会将a资源上锁,完成操作后,就把锁释放掉。
死锁1
两个人一起在餐厅吃饭,A拿着叉子,B拿着勺子。A,B都不愿意自己手里什么都没有,但是A想喝汤,B想吃意面,两个人都不愿意把餐具先给对方,结果两个人就一直干耗下去,长长久久,但是餐厅的桌子就那么几张,AB就一直占着这张桌子,这就是死锁。
记得还有一个关于死锁很好玩的故事,一个应聘生去面试,HR问他,请你解释一下什么是死
锁,应聘生说,你发给我offer,我就告诉你什么是死锁。
在多线程编程中,死锁肯定是重点关注的问题之一。
,