Python多线程Threading简述

多线程能干啥? 我现在认为能干的两件事情:
1.能多线程做爬虫(不如分布式,但是足够用,嘿嘿!)
2.能做socket通讯(这个目前还不会 :))

注意下边所提及的.join() 阻塞函数或者说叫加入函数
可以理解成***等你来了我们一起走**** 等儿子线程搞定,爸爸线程(主线程)再启动

****_______画重点______****
1.建立需要进入线程的方法 多个def
2.建立一个线程列表 threads=[]
3.定义线程 t1= threading.Thread(target=XX方法,args=(函数))
4.加载线程到线程列表内
5.使用for循环+start()启动线程
6.使用joni阻塞主线程等待子线程完成

注释事项
1.如果无.join() 那么就是 儿子爸爸一起启动你干你的,我干我的。谁也别管谁。

2.还有一个守护线程(setDaemon) 可以理解成亲生儿子和外来的儿子,把儿子设置成守护线程就是外来的儿子。这个亲生儿子干完活儿了, 外来的儿子的活儿就不用干了。 请参考最后一段代码有阐述。

#coding:utf-8
import threading
from time import sleep
from time import ctime

def Spider_1(name):
    print '子线程:%s启动:'%name+ctime()
    sleep(1)
    print '子线程:%s完成:'%name+ctime()
def Spider_2(name):
    print '子线程:%s启动:'%name+ctime()
    sleep(3)
    print '子线程:%s完成:'%name+ctime()
def Spider_3(name):
    print '子线程:%s启动:'%name+ctime()
    sleep(4)
    print '子线程:%s完成:'%name+ctime()

threads = [] #创建线程列表 加入现有线程任务

t1 = threading.Thread(target=Spider_1,args=('一号爬虫',)) #特别注意这里args是函数的参数且是元组,需要在参数后加逗号否则自动拆分多个数值了
threads.append(t1)
t2 = threading.Thread(target=Spider_2,args=('二号爬虫',))
threads.append(t2)
t3 = threading.Thread(target=Spider_3,args=('三号爬虫',))
threads.append(t3)

if __name__ == '__main__':
     for t in threads:
        t.start()
     t.join() #注意在for循环外
     print '***主线线程结束于*** %s' %ctime()

还有一种特殊情况如下
即:没有.join 但是设置某个线程为 setDaemon(True)即保护线程,那么这个线程属于打酱油的。如果其他线程结束了那么这个线程无论结束与否都会被KILLLLL!

以下代码我设置t3为守护线程,t3执行时间为4秒,t1 和 t2 都小于这个数字,换句话说t1和t2 都会在t3执行完毕前执行完成。因为t3没有地位是个守护线程。t1 t2 结束大家就收工了。 t3也不用干活了。 

这样讲大家明白不? 能明白我相信你可以的

#coding:utf-8
import threading
from time import sleep
from time import ctime

def Spider_1(name):
    print '子线程:%s启动:'%name+ctime()
    sleep(1)
    print '子线程:%s完成:'%name+ctime()
def Spider_2(name):
    print '子线程:%s启动:'%name+ctime()
    sleep(3)
    print '子线程:%s完成:'%name+ctime()
def Spider_3(name):
    print '子线程:%s启动:'%name+ctime()
    sleep(4)
    print '子线程:%s完成:'%name+ctime()

threads = [] #创建线程列表 加入现有线程任务

t1 = threading.Thread(target=Spider_1,args=('一号爬虫',)) #特别注意这里args是函数的参数且是元组,需要在参数后加逗号否则自动拆分多个数值了
threads.append(t1)
t2 = threading.Thread(target=Spider_2,args=('二号爬虫',))
threads.append(t2)
t3 = threading.Thread(target=Spider_3,args=('三号爬虫',))
threads.append(t3)

t3.setDaemon(True)

if __name__ == '__main__':
     for t in threads:
        t.start() 
     print '***主线线程开始于*** %s' %ctime()