多線程適用於IO密集型,多線程實現方式有兩種,詳見下方例子
例子:
import threading
class MyThread(threading.Thread):
def __init__(self, args):
#使用super寫法,按照父類.方法的方式直接重寫
super(MyThread, self).__init__()
self.args = args
def run(self):
print ("start MyThread {0}".format(self.args))
def worker(n):
print ("start worker{0}".format(n))
if __name__ == "__main__":
#同多進程使用方法
for i in xrange(1, 6):
#使用threading.Thread指定函數和參數,多線程執行
t1 = threading.Thread(target=worker, args=(i,))
#開始多線程執行
t1.start()
t1.join()
#重寫threading.Thread中的run方法實現多線程
for x in xrange(6, 11):
t2 = MyThread(x)
t2.start()
t2.join()
輸出:
start worker1
start worker2
start worker3
start worker4
start worker5
start MyThread 6
start MyThread 7
start MyThread 8
start MyThread 9
start MyThread 10
多線程鎖
多線程鎖的兩種寫法,詳見下面兩個例子
例子:
import threading
import time
def worker(name, lock):
#with寫法會自動獲得鎖並自動釋放鎖,與
with lock:
print ("start {0}".format(name))
time.sleep(2)
print ("end {0}".format(name))
if __name__ == "__main__":
#鎖的實例化
lock = threading.Lock()
t1 = threading.Thread(target=worker, args=("worker1", lock))
t2 = threading.Thread(target=worker, args=("worker2", lock))
t1.start()
t2.start()
print ("main end")
輸出:
start worker1
main end
end worker1
start worker2
end worker2
例子:
import threading
import time
def worker(name, lock):
#獲取線程鎖
lock.acquire()
#捕獲異常
try:
print ("start {0}".format(name))
time.sleep(2)
print ("end {0}".format(name))
except Exception as e:
raise e
finally:
#釋放線程鎖
lock.release()
if __name__ == "__main__":
#鎖的實例化
lock = threading.Lock()
t1 = threading.Thread(target=worker, args=("worker1", lock))
t2 = threading.Thread(target=worker, args=("worker2", lock))
t1.start()
t2.start()
print ("main end")
輸出:
start worker1
main end
end worker1
start worker2
end worker2
線程的共享內存
線程缺點是有一個線程崩潰時所有剩餘線程均會崩潰
例子:
#線程共享內存
import threading
def worker(l):
l.append("a")
l.append("b")
l.append("c")
if __name__ == "__main__":
l = list()
l += xrange(1,6)
print (l)
t = threading.Thread(target=worker, args=(l,))
t.start()
print (l)
輸出:
a1 b2 c3
a4 b5 c6
線程池
例子:
#此包爲第三方包,需要使用pip安裝
import threadpool
def test1(a, b, c):
print("a{0} b{1} c{2}".format(a, b, c))
if __name__ == "__main__":
#the way one
lst_vars_1 = ['1', '2', '3']
lst_vars_2 = ['4', '5', '6']
func_var = [(lst_vars_1, None), (lst_vars_2, None)]
# the way two
dict_vars_1 = {'a':'1', 'b':'2', 'c':'3'}
dict_vars_2 = {'a':'4', 'b':'5', 'c':'6'}
func_var = [(None, dict_vars_1), (None, dict_vars_2)]
pool1 = threadpool.ThreadPool(2)
request = threadpool.makeRequests(test1, func_var)
[pool1.putRequest(req) for req in request]
pool1.wait()