最近看了一下《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,我就告诉你什么是死锁。

在多线程编程中,死锁肯定是重点关注的问题之一。