python之路--关于线程的一些方法

1. 线程的两种创建方式

from threading import Thread
# 第一种创建方式
def f1(n):
    print(‘%s号线程任务‘%n)
def f2(n):
    print(‘%s号线程任务‘%n)
if __name__ == ‘__main__‘:
    t1 = Thread(target=f1,args=(1,))
    t2 = Thread(target=f2,args=(2,))
    t1.start()
    t2.start()
    print(‘主线程‘)
# 第二种创建方式
class MyThread(Thread):
    def __init__(self,name):
        # super(MyThread, self).__init__()  和下面super是一样的
        super().__init__()
        self.name = name
    def run(self):
        print(‘hello girl :‘ + self.name)
if __name__ == ‘__main__‘:
    t = MyThread(‘alex‘)
    t.start()
    print(‘主线程结束‘)

2. 查看线程的pid

import os
from threading import Thread
def f1(n):
    print(‘1号=>‘,os.getpid())
    print(‘%s号线程任务‘ % n)
def f2(n):
    print(‘2号=>‘,os.getpid())
    print(‘%s号线程任务‘ % n)
if __name__ == ‘__main__‘:
    t1 = Thread(target=f1,args=(1,))
    t2 = Thread(target=f2,args=(2,))
    t1.start()
    t2.start()
    print(‘主线程‘, os.getpid())
    print(‘主线程‘)

# 由于这些线程都是在一个进程中的,所以pid一致

3.  验证线程之间的数据共享

import time
from threading import Thread
num = 100
def f1(n):
    global num
    num = 3
    time.sleep(1)
    print(‘子线程的num‘, num)  # 子线程的num 3
if __name__ == ‘__main__‘:
    thread = Thread(target=f1,args=(1,))
    thread.start()
    thread.join() # 等待thread执行完在执行下面的代码
    print(‘主线程的num‘, num)  # 主线程的num 3

4. 多进程与多线程的效率对比

import time
from threading import Thread
from multiprocessing import Process
def f1():
    # io密集型
    # time.sleep(1)

    # 计算型:
    n = 10
    for i in range(10000000):
        n = n + i
if __name__ == ‘__main__‘:
    #查看一下20个线程执行20个任务的执行时间
    t_s_time = time.time()
    t_list = []
    for i in range(5):
        t = Thread(target=f1,)
        t.start()
        t_list.append(t)
    [tt.join() for tt in t_list]
    t_e_time = time.time()
    t_dif_time = t_e_time - t_s_time
    #查看一下20个进程执行同样的任务的执行时间
    p_s_time = time.time()
    p_list = []
    for i in range(5):
        p = Process(target=f1,)
        p.start()
        p_list.append(p)
    [pp.join() for pp in p_list]
    p_e_time = time.time()
    p_dif_time = p_e_time - p_s_time
    # print(‘多线程的IO密集型执行时间:‘,t_dif_time)  # 1.0017869472503662 还需要减1秒的time.sleep
    # print(‘多进程的IO密集型执行时间:‘,p_dif_time)  # 1.2237937450408936  也需要减1秒的time.sleep

    print(‘多线程的计算密集型执行时间:‘, t_dif_time)  # 3.58754563331604
    print(‘多进程的计算密集型执行时间:‘, p_dif_time)  # 2.1555309295654297

  # 从上述代码中的执行效率可以看出来,多线程在执行IO密集型的程序的时候速度非常快,但是执行计算密集型的程序的时候很慢,所以说python这门语言不适合做大数据.

5. 互斥锁,同步锁

import time
from threading import Lock, Thread
num = 100
def f1(loc):
    # 加锁
    with loc:
        global num
        tmp = num
        tmp -= 1
        time.sleep(0.001)
        num = tmp
        # 上面的代码相当于 num -= 1
if __name__ == ‘__main__‘:
    t_loc = Lock()
    t_list = []
    for i in range(10):
        t = Thread(target=f1,args=(t_loc,))
        t.start()
        t_list.append(t)
    [tt.join() for tt in t_list]
    print(‘主线的num‘,num)

6. 死锁现象

import time
from threading import Thread,Lock,RLock
def f1(locA,locB):
    locA.acquire()
    print(‘f1>>1号抢到了A锁‘)
    time.sleep(1)
    locB.acquire()
    print(‘f1>>1号抢到了B锁‘)
    locB.release()
    locA.release()
def f2(locA,locB):
    locB.acquire()
    print(‘f2>>2号抢到了B锁‘)
    time.sleep(1)
    locA.acquire()
    print(‘f2>>2号抢到了A锁‘)
    locA.release()
    locB.release()
if __name__ == ‘__main__‘:
    # locA = locB = Lock()  # 不能这么写,这么写相当于这两个是同一把锁
    locA = Lock()
    locB = Lock()
    t1 = Thread(target=f1,args=(locA,locB))
    t2 = Thread(target=f2,args=(locA,locB))
    t1.start()
    t2.start()
# 上面的代码表示f1 先抢到了A锁,同时f2 抢到了B锁,一秒后f1想去想B锁,同时f2想去抢A锁,
# 由于锁需要先放开才能继续抢,导致了死锁现象

  

7.递归锁

import time
from threading import Thread, Lock, RLock
def f1(locA, locB):
    locA.acquire()
    print(‘f1>>1号抢到了A锁‘)
    time.sleep(1)
    locB.acquire()
    print(‘f1>>1号抢到了B锁‘)
    locB.release()
    locA.release()
def f2(locA, locB):
    locB.acquire()
    print(‘f2>>2号抢到了B锁‘)
    locA.acquire()
    time.sleep(1)
    print(‘f2>>2号抢到了A锁‘)
    locA.release()
    locB.release()
if __name__ == ‘__main__‘:
    locA = locB = RLock()  #递归锁,维护一个计数器,acquire一次就加1,release就减1 , acquire等于0的时候才可以抢
    t1 = Thread(target=f1, args=(locA, locB))
    t2 = Thread(target=f2, args=(locA, locB))
    t1.start()
    t2.start()

  # 递归锁解决了死锁现象,会让代码继续执行.

8. 守护线程

  守护线程会等到所有的非守护线程运行结束后才结束

import time
from threading import Thread
from multiprocessing import Process

#守护进程:主进程代码执行运行结束,守护进程随之结束

#守护线程:守护线程会等待所有非守护线程运行结束才结束

def f1():
    time.sleep(2)
    print(‘1号线程‘)
def f2():
    time.sleep(3)
    print(‘2号线程‘)
if __name__ == ‘__main__‘:
    t1 = Thread(target=f1,)
    t2 = Thread(target=f2,)
    # t1.daemon = True  # 1号进程 和 2 号进程都会打印
    t2.daemon = True # 不会打印2号进程
    t1.start()
    t2.start()
    print(‘主线程结束‘)
    # 与进程对比
    p1 = Process(target=f1, )
    p2 = Process(target=f2, )
    p1.daemon = True  # 只会打印 2号进程
    p2.daemon = True  # 只会打印1号进程
    p1.start()
    p2.start()
    print(‘主进程结束‘)

9. GIL锁的解释

原文地址:https://www.cnblogs.com/attila/p/10257443.html

时间: 2024-07-31 19:44:55

python之路--关于线程的一些方法的相关文章

python之路-------之线程

线程概念的引入背景 进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本:进程是程序的一次执行活动,属于动态概念.在多道编程中,我们允许多个程序同时加载到内存中,在操作系统的调度下,可以实现并发地执行.就是这样的设计,大大提高了CPU的利用率.进程的出现让每个用户感觉到自己独享CPU,因此,进程就是为了在CPU上实现多道编程而提出的.

Python之路:线程池

版本一 #!/usr/bin/env python# -*- coding:utf-8 -*-import Queueimport threading  class ThreadPool(object):     def __init__(self, max_num=20):        self.queue = Queue.Queue(max_num)        for i in xrange(max_num):            self.queue.put(threading.T

Python之路45-多线程

threading模块 线程有两种调用方式 直接调用 import threading import time def sayhi(num):     # 定义每个线程要执行的函数     print("running on number:%s" % num)     time.sleep(2) if __name__ == "__main__":     t1 = threading.Thread(target=sayhi, args=(1,))  # 生成一个线

Python之路(第四十二篇)线程相关的其他方法、join()、Thread类的start()和run()方法的区别、守护线程

一.线程相关的其他方法 Thread实例对象的方法 # isAlive(): 返回线程是否活动的. # getName(): 返回线程名. # setName(): 设置线程名. ? threading模块提供的一些方法: # threading.currentThread(): 返回当前的线程对象. # threading.enumerate(): 返回一个包含正在运行的线程的list.正在运行指线程启动后.结束前,不包括启动前和终止后的线程. # threading.activeCount(

Python之路【第七篇】:线程、进程和协程

Python之路[第七篇]:线程.进程和协程 Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/usr/bin/env python # -*- coding:utf-8 -*- import threading import time   def show(arg):     time.sleep(1)     print 'thread'+str(arg)   for i in

【Python之路Day11】网络篇之线程、进程、协程

目录: 基本概念 线程 进程 协程  一. 基本概念 现在的操作系统,如Unix.Linux.Windows.Mac OS X等,都是支持“多任务”的操作系统. 什么叫”多任务“呢?简单理解,就是我们可以一般上网浏览某车之家的网页,看看喜欢的车型信息:一边打开某易云音乐听听好歌:一边打开某软件股市行情图,不安的盯着曲线图...卧槽,又尼玛跌了!  这就是多任务喽. 多核心的CPU已经很普及了,但是,就是在过去的单核心CPU上,也可以执行多任务. PS: CPU是分时间片的,假设任务1执行0.01

Python之路(十八):进程,线程,协程

python基础之进程.线程.协程 引子 进程 线程(优先阅读) 协程 进程 概念:就是一个程序在一个数据集上的一次动态执行过程(本质上来讲,就是运行中的程序(代指运行过程),程序不运行就不是进程)    抽象概念 组成:  1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成  2.数据集:数据集则是程序在执行过程中所需要使用的资源  3.进程控制块:进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志. 阐释:进程

python协程,线程的其他方法

OK 这一篇主要是协程的,还落下了点线程的方法,先说线程, 线程池 线程池回调函数 协程 一. 线程池   线程池顾名思义就是跟是跟进程池一样的 到这里就差我们的线程池没有讲了,我们用一个新的模块给大家讲,早期的时候我们没有线程池,现在python提供了一个新的标准或者说内置的模块,这个模块里面提供了新的线程池和进程池,之前我们说的进程池是在multiprocessing里面的,现在这个在这个新的模块里面,他俩用法上是一样的. 为什么要将进程池和线程池放到一起呢,是为了统一使用方式,使用thre

Python之路(第四十五篇)线程Event事件、 条件Condition、定时器Timer、线程queue

一.事件Event Event(事件):事件处理的机制:全局定义了一个内置标志Flag,如果Flag值为 False,那么当程序执行 event.wait方法时就会阻塞,如果Flag值为True,那么event.wait 方法时便不再阻塞. Event其实就是一个简化版的 Condition.Event没有锁,无法使线程进入同步阻塞状态. Event() set(): 将标志设为True,并通知所有处于等待阻塞状态的线程恢复运行状态. clear(): 将标志设为False. wait(time