Python 线程与进程
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
使用 threading 模块
方法一:
importthreading importtime deffoo(n): print('foo%s'%n) time.sleep(1) print('endfoo') defbar(n): print('bar%s'%n) time.sleep(2) print('endbar') t1=threading.Thread(target=foo,args=(1,)) t2=threading.Thread(target=bar,args=(2,)) t1.start() t2.start() print('........inthemain..........')
运行结果:
foo1 bar2 ........inthemain.......... endfoo endbar
方法二:
importtime,threading classMyThread(threading.Thread): def__init__(self,num): threading.Thread.__init__(self) self.num=num defrun(self):#定义线程要运行的函数 print("runningonnumber:%s"%self.num) time.sleep(3) if__name__=='__main__': t1=MyThread(1) t2=MyThread(2) t1.start() t2.start()
运行结果:
runningonnumber:1 runningonnumber:2
join 方法使得主线程等待子线程完成才继续
importthreading importtime begin=time.time() deffoo(n): print('foo%s'%n) time.sleep(1) print('endfoo') defbar(n): print('bar%s'%n) time.sleep(2) print('endbar') t1=threading.Thread(target=foo,args=(1,)) t2=threading.Thread(target=bar,args=(2,)) t1.start() t2.start() t1.join() t2.join() print('........inthemain..........')
运行结果:
foo1 bar2 endfoo endbar ........inthemain..........
相关推荐:《Python视频教程》
在计算密集型任务中串行与多线程进行对比
importthreading,time begin=time.time() defadd(n): sum=0 foriinrange(n): sum+=i print(sum) add(100000000) add(200000000) end=time.time() print(end-begin)
运行结果:
4999999950000000 19999999900000000 17.66856598854065
importthreading,time begin=time.time() defadd(n): sum=0 foriinrange(n): sum+=i print(sum) t1=threading.Thread(target=add,args=(100000000,)) t1.start() t2=threading.Thread(target=add,args=(200000000,)) t2.start() t1.join() t2.join() end=time.time() print(end-begin)
运行结果:
4999999950000000 19999999900000000 21.088160276412964 #结果为串行运行比多线程运行更快
Cpython 中有 GIL (Global Interpreter Lock,全局解释器锁),所以在同一时刻,只能有一个线程进入调度。如果任务是IO密集型的,可以使用多线程;如果任务是计算密集型的,最优方法是改成 C。
setDaemon()
调用该方法只要是主线程完成,不管子线程是否完成都要和主线程一起退出。
threading.currentThread()
返回当前的线程变量。
threading.active_count()
返回正在运行的线程数量。
importthreading,time fromtimeimportctime,sleep defmusic(func): print(threading.current_thread()) foriinrange(2): print("Beginlisteningto%s.%s"%(func,ctime())) sleep(2) print("endlistening%s"%ctime()) defmovie(func): print(threading.current_thread()) foriinrange(2): print("Beginwatchingatthe%s%s"%{func,ctime()}) sleep(4) print("endwatching%s"%ctime()) threads=[] t1=threading.Thread(target=music,args=('klvchen',)) threads.append(t1) t2=threading.Thread(target=movie,args=('lili',)) threads.append(t2) if__name__=='__main__': fortinthreads: t.setDaemon(True) t.start() print(threading.current_thread()) print(threading.active_count()) print("allover%s"%ctime())
运行结果:
<Thread(Thread-1,starteddaemon5856)> Beginlisteningtoklvchen.WedJul1123:43:512018 <Thread(Thread-2,starteddaemon9124)> <_MainThread(MainThread,started9444)> 3 alloverWedJul1123:43:512018
上一篇
下一篇