python 中线程的知识点

1.线程是最小的进程

2.在python中使用线程需要引入 threading包

3.引入线程最重要的是小心高并发的问题

4.解决高并发的问题可以尝试使用锁的概念

 

直接上代码:

一.创建线程:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import threading
import time
def job():
    time.sleep(1)   
    print "正在执行任务"
    print "当前线程的个数",threading.active_count()
    print "当前线程信息",threading.current_thread()



if __name__ == "__main__":
    #运行函数
    #job()
    #创建线程,并执行
    t1 = threading.Thread(target = job ,name = "job1" ,args=())
    t2 = threading.Thread(target = job ,name = "job221" ,args=())
    #开始线程
    t1.start()
    t2.start()

二.多个线程

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import threading
import time
def readBook(name):
    time.sleep(1)
    print "马化腾正在读",name

def listenMusic(name):
    time.sleep(2)
    print "三毛正在听",name

if __name__=="__main__":
    t1 = threading.Thread(target = readBook,name = readBook, args=("水浒传",))
    t2 = threading.Thread(target = listenMusic,name = listenMusic ,args=("小哪吒",))
    t1.start()
    t2.start()
    # join方法: 在使用多线程时,会等使用该方法的待线程结束之后,再执行其他线程,作用就是阻塞正在调用的其它线程。
    t1.join()
    t2.join()
    print (time.ctime())

三.继承加线程

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import threading

class Job(threading.Thread):
    def __init__(self,jobname):
        super(Job,self).__init__()
        self.jobname = jobname

    def run(self):
        print "this is Chinese air"



t1 = Job(jobname = "jinwanchisaokao")
t1.start()

四.线程守护

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import threading
import time
def readBook(name):
    time.sleep(1)
    print "马化腾正在读",name

def listenMusic(name):
    time.sleep(2)
    print "三毛正在听",name

if __name__=="__main__":
    t1 = threading.Thread(target = readBook, args=("水浒传",))
    t2 = threading.Thread(target = listenMusic,args=("小哪吒",))
    # 将t1线程生命为守护线程, 如果设置为True, 子线程启动, 当主线程执行结束, 子线程也结束
    # 设置setDaemon必须在启动线程之前进行设置
    #设置一个为false都不行
    t1.setDaemon(True)
    #t2.setDaemon(True)
    t1.start()
    t2.start()
    #t1.join()
    #t2.join()
    print (time.ctime())

五.多线程和单线程区别

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import threading

def job(li):
    sum(li)
    #print li

def use_thread():
    li = range(1,10000)
    for i in range(5):
        t = threading.Thread(target=job, args=(li, ))
        t.start()

def use_no_thread():
    li = range(1, 10000)
    for i in range(5):
        job(li)
 
 
if __name__ == "__main__":
    use_thread()
    #use_no_thread()

六.线程锁

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import threading

def add(lock):
    # 操作变量之前进行加锁
    lock.acquire()
    global money
    for i in range(10000000):
        money +=1
     #操作变量完成后进行解锁
    lock.release()

def reduce(lock):
    lock.acquire()
    global money
    for i in range(10000000):
        money -=1
    lock.release()

if __name__=="__main__":
    money = 0
    #实例化一个锁对象
    lock = threading.Lock()
    t1 = threading.Thread(target = add ,args = (lock,))
    t2 = threading.Thread(target = reduce , args = (lock,))
    t1.start()
    t2.start()

    t1.join()
    t2.join()
    print 'monet',money

七.线程加队列

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import threading
from queue import Queue

#1.理论上多线程执行任务, 会产生一些数据, 为其他程序执行作铺垫;
#2. 多线程是不能返回任务执行结果的, 因此需要一个容器来存储多线程产生的数据
#3. 这个容器如何选择? list(栈, 队列), tuple(x), set(x), dict(x), 此处选择队列来实现

def job(l,queue):
    queue.put(sum(l))


def use_thread():
    q = Queue()
    threads = []
    list1 = [[1, 5, 7, 3, 6, 2], [5, 23, 4, 6], [7, 8, 93, 2], [1, 2, 3, 4]]
    for l in list1:
        t = threading.Thread(target = job , args=(l,q))
        threads.append(t)
        t.start
    [thread.join() for thread in threads]
    #从队列中拿出所有的运行结果
    result = [q.get for _ in range(len(list1))]
    print result


if __name__ == "__main__":
    use_thread()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章