线程与threading模块

 线程

  进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位。在单个进程中同时运行多个线程完成不同的工作,称为多线程。

  同一进程内的多个线程是共享该进程的资源。

  创建新的线程开销要远远小于开启新的进程。

threading模块

  线程的threading模块与进程的multiprocessing模块很类似。  

  模块下的类:

    Thread

    active_count

    enumerate

    current_thread

  方法:

    start()

    join()

    daemon() 守护线程和守护进程有点不一样。主线程在执行完所有非守护线程后,主线程结束,守护线程随之结束。

  示例:

rom threading import Thread,current_thread,active_count,enumerate
import time
def bar():
    print('%s is running'%current_thread().getName() )
    time.sleep(2)
    print('%s is over'%current_thread().getName() )
def foo():
    print('%s is running' % current_thread().getName())
    time.sleep(5)
    print('%s is over' % current_thread().getName())
if __name__ == '__main__':
    t1=Thread(target=bar)
    t2=Thread(target=foo)
    t1.start()
    t2.daemon=True
    t2.start()
    print(enumerate())
    print(active_count())
    print('%s is 主线程' %current_thread().getName())

  输出:

Thread-1 is running
Thread-2 is running
[<_MainThread(MainThread, started 816)>, <Thread(Thread-1, started 7528)>, <Thread(Thread-2, started daemon 13788)>]
3
MainThread is 主线程
Thread-1 is over

   PS:

  多线程用于IO密集型,如socket,爬虫,web
  多进程用于计算密集型,如金融分析

  

  

from multiprocessing import Process
from threading import Thread
import time
def foo():
    sum=0
    for i in range(100000000):
        sum+=i

if __name__ == '__main__':
    start_time=time.time()
    n=os.cpu_count()
    l=[]
    for i in range(n):
        t=Thread(target=foo,)         #41s
        # p=Process(target=foo,)       #9.89s
        # l.append(p)
        l.append(t)
        # p.start()
        t.start()
    for p in l:
        # p.join()
        p.join()
    print('time:',time.time()-start_time)

 

作业:

  三个任务,一个接收用户输入,一个将用户输入的内容格式化成大写,一个将格式化后的结果存入文件。

from threading import Thread
msg_l=[]                    #
format_l=[]                 #这两个是关键呀,相当于进程中的全局变量,进程中的数据(全局变量)是共享的,任何一个线程都可以访问的到。
def talk():                 #三个函数,开启三个线程,做到各司其职,互不干涉,存取数据到进程中的全局变量取就可以了。
    while True:
        msg=input('>>: ').strip()
        if not msg:continue
        msg_l.append(msg)

def format_msg():
    while True:
        if msg_l:
            res=msg_l.pop()
            format_l.append(res.upper())

def save():
    while True:
        if format_l:
            with open('db.txt','a',encoding='utf-8') as f:
                res=format_l.pop()
                f.write('%s\n' %res)

if __name__ == '__main__':
    t1=Thread(target=talk)
    t2=Thread(target=format_msg)
    t3=Thread(target=save)
    t1.start()
    t2.start()
    t3.start()

  思路还是很6的。

posted @ 2017-10-13 16:36  骑者赶路  阅读(310)  评论(0编辑  收藏  举报