python-进程&线程

进程(process):相当于一个程序要运行时所需的所有资源的集合,相当于一个车间,不工作

                        两个进程之间的数据不共享,完全不独立,互相不能访问。

线程(thread):一道单一指令的控制流,寄生在进程中,相当于车间中的工人,工作。一个进程至少需要一个线程,这个线程为主线程,一个进程中可以有多个线程。

                       cpu的核数越多,代表可以并发的线程越多

                       一个进程中的不同线程共享数据,多线程在修改同一个数据时,一定要加锁

 

___线程___

  1、threading模块

       声明一个线程t=threading.Thread(target=线程函数名,args=(参数,))

    启动一个线程:t.start()

1 import threading
2 def func1(n):      
3     print('thread:%s'%n)
4 t=threading.Thread(target=func1,args=(i,))
5 t.start()

   2、实现多线程并发

 

           即同时启动多个线程,并发运行

import threading
import time
def func1(n):
    time.sleep(8)       #为了更直观的感受到并发效果~~
    print('thread:%s'%n)
for i in range(30):           #同时启动30个线程,并发
    t=threading.Thread(target=func1,args=(i,))
    t.start()

   3、线程的其他小方法

          t.getName():取线程名 ,该名称是唯一的

          t.setName('sefjsjfisojgiod') :设置线程名字,如果不设置,系统会自动起名

          threading.active_count() :当前活跃的线程数

          threading.current_thread():当前运行的线程实例

 1 import threading
 2 import time
 3 def run(n):
 4     time.sleep(3)
 5     print('thread',n)
 6     print(threading.current_thread())  #打印当前运行的线程的实例
 7 for i in range(10):
 8     t=threading.Thread(target=run,args=(i,))
 9     t.start()
10     t.setName('kasjdjakldjalsjdlasjdlsd%s'%i)  #修改线程的名字,默认是Thread-i
11     print(t.getName())                          #获取线程名,线程名是唯一的
12 print(threading.active_count())                  #统计活跃的线程数

   4、线程等待

          前面程序运行的时候,都是主线程启动和子线程之后,和子线程一起运行,那么如何实现主线程启动了子线程之后先不运行,等待子线程运行完毕之后(比如有些场景需要主线程拿到子线程的结果)再运行呢?????

         线程等待:t.join()

 1 import threading
 2 import time
 3 
 4 def run(n):
 5     time.sleep(1)
 6     print('thread',n)
 7 t_list=[]
 8 for i in range(10):
 9     t=threading.Thread(target=run,args=(i,))
10     t.start()
11     t_list.append(t)          #将启动的线程加入到有个列表中
12 for t in t_list:
13     t.join()            #  等待所有线程运行完毕
14 print('))))))))))))))))))))))))))))))))))))))))')

            注意:如果将t.join()加载t.start()之后,那么就不是并行运行了,变成了串行

  5、守护线程

          前面主线程执行完毕,未执行的子线程仍继续执行,并不受主线程的影响,有些场景主线程完毕之后,子线程变没有意义了,那么如何让主线程执行完毕之后,子线程也停止执行,程序退出呢???  

    场景举例:ftpserver为主线程,一个子线程的功能是断开很久没有活跃的连接,比如半小时这个连接没有活动,就将该链接断开。该子线程是一个独立的线程,如果主线程已经退出了,那么该子线程也没有存在的意义了。    怎么实现该子线程在主线程断开之后也停止运行呢????        将该子线程设置为主线程的守护线程就可以啦~~~

   t.setDaemon()

 1 import threading
 2 import time
 3 def run(n):
 4     time.sleep(1)
 5     print('thread:%s'%n)
 6 for i in range(10):
 7     t=threading.Thread(target=run,args=(1,))
 8     t.setDaemon(True)    #  启动线程之前,将线程设置为守护进程,则主线程结束后,子线程也结束,不会继续执行
 9     t.start()
10 
11 print('hahhhahahahaha')

 

posted @ 2017-01-07 17:38  3456425171  阅读(178)  评论(0编辑  收藏  举报