今天,看了python 核心編程的第四章,多線程編程,記錄一下要點。 1、進程和線程 進程是一個執行中的程式,每個進程都有自己的地址空間、記憶體、資料棧以及其他用於跟蹤執行的輔助資料.。 線程,實在同一個進程下執行的,共用相同的上下文,一個進程中的各個線程與主線程共用一片資料空間,線程之間的資訊共用和通訊會更加容易。 2、使用多線程 python 中有thread 模組和 threading 模組
thread模組的核心函數是thread.start_new_thread(),使用thread模組的案例.
import threadfrom time import ctime, sleeploops = [4,2]def loop(nloop, nsec, lock):print 'start loop', nloop, 'at:', ctime()sleep(nsec)print 'loop', nloop, 'done at:' , ctime()lock.release()def main():print 'starting at:', ctime()locks = []nloops = range(len(loops))for i in nloops:lock = thread.allocate_lock()lock.acquire()locks.append(lock)for i in nloops:thread.start_new_thread(loop,(i, loops[i], locks[i]))for i in nloops:while locks[i].locked():passprint 'all Done at: ', ctime()if __name__ == '__main__':main()
threading 模組 threadIng模組與thread模組相比,它支援守護線程。守護線程的概念可以這樣理解,如果一個線程設定為守護線程,就表示這個線程是不重要的,進程退出時不需要等待這個線程執行完成。 如果要將一個線程設定為守護線程,需要線上程執行之前,設定 thread.daemon = True 使用Thread 類建立多線程案例,
import threadingfrom time import sleep, ctimeclass MyThread(threading.Thread):"""docstring for MyThread"""def __init__(self, func, args, name=''):super(MyThread, self).__init__()self.name = nameself.func = funcself.args = argsdef getResult(self):return self.resdef run(self):self.res = self.func(*self.args)loops = [4,2]def loop(nloop, nsec):print 'start loop', nloop, 'at: ', ctime()sleep(nsec)print 'loop done', nloop, 'at: ', ctime()return 'ws'def main():print 'starting at: ', ctime()threads = []nloops = range(len(loops))for i in nloops:#t = threading.Thread(target = loop, args = (i, loops[i]))t = MyThread(loop,(i,loops[i]),loop.__name__)threads.append(t)for i in nloops:threads[i].start()for i in nloops:threads[i].join()print threads[i].getResult()if __name__ == '__main__':main()
3、同步原語 使用同步的情況,在使用多線程時,有些特定的函數或者代碼塊不希望被多個線程同時執行。
#!/usr/bin/env pythonfrom atexit import registerfrom random import randrangefrom threading import Thread, Lock, currentThreadfrom time import sleep, ctimeclass CleanOutputSet(set): def __str__(self): return ', '.join(x for x in self)lock = Lock()loops = (randrange(2, 5) for x in xrange(randrange(3, 7)))remaining = CleanOutputSet()def loop(nsec): myname = currentThread().name lock.acquire() remaining.add(myname) print '[%s] Started %s' % (ctime(), myname) #print '[{0}] Started {1}'.format(ctime(), myname) lock.release() sleep(nsec) lock.acquire() remaining.remove(myname) print '[%s] Completed %s (%d secs)' % ( #print '[{0}] Completed {1} ({2} secs)'.format( ctime(), myname, nsec) print ' (remaining: %s)' % (remaining or 'NONE') #print ' (remaining: {0})'.format(remaining or 'NONE') lock.release()def _main(): for pause in loops: Thread(target=loop, args=(pause,)).start()@registerdef _atexit(): print 'all DONE at:', ctime()if __name__ == '__main__': _main()
python支援的多種類型的同步原語,包括鎖/互斥、訊號量 使用鎖時,調用lock.require()函數擷取鎖,調用lock.release()函數釋放鎖