python 之多線程編程

來源:互聯網
上載者:User
今天,看了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()函數釋放鎖

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.