python筆記六:進程與線程

來源:互聯網
上載者:User

標籤:

1.進程

  1)調用unix/linux系統中的進程函數fork(),用法和linux相同,調用成功返回0,失敗返回-1:

import osprint ‘Process (%s) start...‘ % os.getpid()pid = os.fork()if pid==0:    print ‘I am child process (%s) and my parent is %s.‘ % (os.getpid(), os.getppid())else:    print ‘I (%s) just created a child process (%s).‘ % (os.getpid(), pid)

  2)調用multiprocessing模組:

  multiprocessing模組提供了一個Process類來代表一個進程對象,建立進程的過程:

  Process()建立進程執行個體,用start()啟動進程,join()等待進程處理。

from multiprocessing import Processimport osdef proc(name):    print ‘child process %s (%s)...‘ % (name, os.getpid())if __name__==‘__main__‘:    print ‘Parent process %s.‘ % os.getpid()    p = Process(target=proc, args=(‘test‘,))    print ‘Process will start.‘    p.start()    p.join()    print ‘Process end.‘

  3)建立進程池pool:

  對Pool對象調用join()方法會等待所有子進程執行完畢,調用join()之前必須先調用close(),調用close()之後就不能繼續添加新的Process了。

from multiprocessing import Poolimport os, time, randomdef long_time_task(name):    print ‘Run task %s (%s)...‘ % (name, os.getpid())    start = time.time()    time.sleep(random.random() * 3)    end = time.time()    print ‘Task %s runs %0.2f seconds.‘ % (name, (end - start))if __name__==‘__main__‘:    print ‘Parent process %s.‘ % os.getpid()    p = Pool()    for i in range(5):        p.apply_async(long_time_task, args=(i,))    print ‘Waiting for all subprocesses done...‘    p.close()    p.join()    print ‘All subprocesses done.‘

  4)進程通訊:pipes和queue.

2.線程

  線程在執行過程中與進程是有區別的。每個獨立的線程有一個程式啟動並執行入口、順序執行序列和程式的出口。但是線程不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個線程執行控制。指令指標和堆棧指標寄存器是線程上下文中兩個最重要的寄存器,線程總是在進程得到上下文中啟動並執行,這些地址都用於標誌擁有線程的進程地址空間中的記憶體。python中的兩個線程模組threadthreadingthread是低級模組,threading是進階模組,對thread進行了封裝。

  1)函數式:調用thread模組中的start_new_thread()函數來產生新線程

  thread.start_new_thread ( function, args[, kwargs] )

import threadimport timedef print_time( threadName, delay):   count = 0   while count < 5:      time.sleep(delay)      count += 1      print "%s: %s" % ( threadName, time.ctime(time.time()) )try:   thread.start_new_thread( print_time, ("Thread-1", 2, ) )   thread.start_new_thread( print_time, ("Thread-2", 4, ) )except:   print "Error: unable to start thread"while 1:   pass

  2)線程模組:

  threading.currentThread(): 返回當前的線程變數。

  threading.enumerate(): 返回一個包含正在啟動並執行線程的list。正在運行指線程啟動後、結束前,不包括啟動前和終止後的線程。

  threading.activeCount(): 返回正在啟動並執行線程數量,與len(threading.enumerate())有相同的結果。

  Thread類提供了以下方法:

  run(): 用以表示線程活動的方法。

  start():啟動線程活動。

  join([time]): 等待至線程中止。這阻塞調用線程直至線程的join() 方法被調用中止-正常退出或者拋出未處理的異常-或者是可選的逾時發生。

  isAlive(): 返回線程是否活動的。

  getName(): 返回線程名。

  setName(): 設定線程名。

import threadingimport timeexitFlag = 0class 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 "Starting " + self.name        print_time(self.name, self.counter, 5)        print "Exiting " + self.namedef print_time(threadName, delay, counter):    while counter:        if exitFlag:            thread.exit()        time.sleep(delay)        print "%s: %s" % (threadName, time.ctime(time.time()))        counter -= 1thread1 = myThread(1, "Thread-1", 1)thread2 = myThread(2, "Thread-2", 2)thread1.start()thread2.start()print "Exiting Main Thread"

  3)threading.Lock():鎖只有一個,無論多少線程,同一時刻最多隻有一個線程持有該鎖.一個線程使用自己的局部變數比使用全域變數好,因為局部變數只有線程自己能看見,不會影響其他線程,而全域變數的修改必須加鎖。

python筆記六:進程與線程

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.