標籤:
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中的兩個線程模組thread
和threading
,thread
是低級模組,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筆記六:進程與線程