Single threaded:
Import Time def Sorry (): Print "I'm sorry!" Time.sleep (1)if__name__= ='__main__': for in range (5): Sorry ()
Add thread
Import threading
Def thread_job ():
print ' This is a added thread,number is%s '% Threading.current_thread ()
if __name__ = = ' __main__ ':
Added_thread = Threading. Thread (Target=thread_job)
Added_thread.start ()
Join waits for the thread to end before executing
Importtime,threadingdefthread_job ():Print 'T1 start\n' forIinchRange (10): Time.sleep (0.1) Print 'T1 finish\n'defMian (): Added_thread= Threading. Thread (target=thread_job,name='T1') Added_thread.start ()Print 'All done\n'if __name__=='__main__': Mian ()
Importtime,threadingdefthread_job ():Print 'T1 start\n' forIinchRange (10): Time.sleep (0.1) Print 'T1 finish\n'defMian (): Added_thread= Threading. Thread (target=thread_job,name='T1') Added_thread.start () Added_thread.join ()Print 'All done\n'if __name__=='__main__': Mian ()
Queue function because return is not available in threads
Importtime,threading fromQueueImportQueuedefJob (l,q): forIinchRange (len (l)): L[i]= L[i]**2q.put (L)defmultithreading (): Q=Queue () Threads=[] Data= [[1,2,3],[3,4,5],[4,4,4],[5,5,5]] forIinchRange (4): T= Threading. Thread (target=job,args=(DATA[I],Q)) T.start () threads.append (t) forThreadinchthreads:thread.join () results= [] for_inchRange (4): Results.append (Q.get ())PrintResultsif __name__=='__main__': Multithreading ()
Lock locks
ImportThreadingdefjob1 ():GlobalA forIinchRange (10): A+ = 1Print 'Job1%d'%Adefjob2 ():GlobalA forIinchRange (10): A+ = 10Print 'Job2%d'%Aif __name__=='__main__': A=0 T1= Threading. Thread (target=job1) T2= Threading. Thread (target=job2) T1.start () T2.start () T1.join () T2.join ()
ImportThreadingdefjob1 ():Globala,lock Lock.acquire () forIinchRange (10): A+ = 1Print 'Job1%d'%A lock.release ()defjob2 ():Globala,lock Lock.acquire () forIinchRange (10): A+ = 10Print 'Job2%d'%A lock.release ()if __name__=='__main__': Lock=Threading. Lock () A=0 T1= Threading. Thread (target=job1) T2= Threading. Thread (target=job2) T1.start () T2.start () T1.join () T2.join ()
PS: Multithreading is not necessarily efficient, there is the existence of Gil Lock, Python can only have one thread to operate the same operation at the same time
ImportThreading fromQueueImportQueueImportCopyImport TimedefJob (L, Q): Res=sum (L) q.put (res)defMultithreading (L): Q=Queue () Threads= [] forIinchRange (4): T= Threading. Thread (Target=job, args= (Copy.copy (L), q), name='t%i'%i) T.start () threads.append (t) [T.join () forTinchThreads] Total=0 for_inchRange (4): Total+=Q.get ()Print(total)defNormal (L): Total=sum (l)Print(total)if __name__=='__main__': L= List (range (1000000)) s_t=time.time () normal (L*) Print('Normal:', Time.time ()-s_t) s_t=Time.time () multithreading (L)Print('Multithreading:', Time.time ()-s_t)
Python core programming Note 4--multithreading