python3 线程_threading模块

‘‘‘并发:同一个时间段内运行多个程序的能力

进程就是一个程序在一个数据集上的一次动态执行过程。进程一般由程序、数据集、进程控制块三部分组成

程序:食谱数据集:鸡蛋、牛奶、糖等进程控制块:记下食谱做到哪一步了

线程:最小的执行单元,程序中具体代码    比如:食谱中的具体操作方法进程:最小的资源管理单元,线程,数据等等  比如:整个食谱

切换的操作者:操作系统进程/线程切换原则:    1、时间片    2、遇到IO操作切换      代码执行input()函数时,本身不占cpu了,输入完成后再切回来。conn,client_addr = sock.accept()执行后不占cpu了,                        开启了另一个有关监听的线程,当接收到数据是再切给accept

串行、并行、并发并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力。所以说,并行是并发的子集

IO密集型任务:程序存在大量IO操作计算密集型任务:程序存在大量计算操作

对于PYTHON的多线程处理:    IO密集型任务有优势    计算密集型任务不推荐使用多线程

‘‘‘

多线程
import threading
import time

def foo(n):
    print(‘>>>>>%s‘ %n)
    time.sleep(3)

def bar(n):
    time.sleep(5)
    print(‘>>>>>%s‘ %n)

s = time.time()

t1 = threading.Thread(target=foo,args=(2,))
t1.start()    # .start()方法激活线程,可以去抢cpu执行

t2 = threading.Thread(target=bar,args=(5,))
t2.setDaemon(True)  # 主线程结束不等待子线程
t2.start()

t1.join()  # 加入主线程阻塞
# t2.join()

print(‘ending!‘)
print(‘cost time:‘,time.time()-s)

线程的类继承式创建

import threading
import time

class MyThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        # super().__init__()

    def run(self):
        print(‘OK‘)
        time.sleep(2)
        print(‘end t1‘)

t1 = MyThread()
t1.start()
print(‘ending‘)

线程三把锁

互斥锁

import threading
import time

def sub():
    global num

    lock.acquire()

    temp = num
    time.sleep(0.1)
    num = temp-1

    lock.release()

    time.sleep(2)

num = 100

lock = threading.Lock()

l = []
for i in range(100):
    t = threading.Thread(target=sub,args=())
    t.start()
    l.append(t)

for t in l:
    t.join()

print(num)

递归锁

import threading
import time

class MyThread(threading.Thread):

    def __init__(self):
        super().__init__()

    def run(self):
        self.foo()
        self.bar()

    def foo(self):
        RLock.acquire()
        print(‘I am %s GET LOCKA-----%s‘ %(self.name,time.ctime()))

        RLock.acquire()
        print(‘I am %s GET LOCKB-----%s‘ %(self.name,time.ctime()))
        RLock.release()
        # time.sleep(1)

        RLock.release()
        # time.sleep(1)

    def bar(self):
        RLock.acquire()
        print(‘I am %s GET LOCKA-----%s‘ %(self.name,time.ctime()))
        # time.sleep(1)
        RLock.acquire()
        print(‘I am %s GET LOCKB-----%s‘ %(self.name,time.ctime()))
        RLock.release()
        # time.sleep(2)

        RLock.release()

RLock = threading.RLock()
# LockB = threading.Lock()

for i in range(10):
    t = MyThread()
    t.start()

信号量

import threading
import time

semaphore = threading.Semaphore(10)

def foo():
    semaphore.acquire()
    print(‘OK‘)
    time.sleep(1)
    semaphore.release()

for i in range(100):
    t = threading.Thread(target=foo,args=())
    t.start()

event对象

import threading,time

event = threading.Event() # 默认isSet()=False,加.wait()阻塞

def foo():
    while not event.is_set():
        print(‘wait.....‘)
        event.wait(2)

        print(‘Connect to redis server‘)

for i in range(5):
    t = threading.Thread(target=foo,args=())
    t.start()

print(‘attempt to start redis server‘)
time.sleep(10)
event.set()     # 主线程给子线程set()

队列

队列:基于锁实现的,用于多线程,保证线程安全的一种数据结构

############################################ FIFO先进先出模型
import queue

q = queue.Queue(3)  # 参数为队列最大数,不加参数默认无限大
print(q)

q.put(11)
q.put(‘hello‘)
# q.put(3.14)
q.put(555,block = False)  # 阻塞,如果队列满,报错
# q.put(555)  # 大于最大值,会阻塞,等待队列中数据被拿走后在进队列

print(q.get())
print(q.get())
print(q.get())
# print(q.get(block = False))  # 阻塞,如果队空,报错

# print(q.get())   # 队列空后,会阻塞,等待队列被加入
############################################ LIFO后进先出模型
import queue

q = queue.LifoQueue()

q.put(11)
q.put(22)
q.put(33)

while not q.empty():
    print(q.get())
############################################ priority优先级模型
import queue

q = queue.PriorityQueue()

q.put([1,‘11111‘])  # []表示一个序列数据类型,也可全部换成()
q.put([1,‘00000‘])  # 优先级相同,优先级按照ascii码顺序
q.put([5,‘55555‘])
q.put([3,‘33333‘])
q.put([4,‘44444‘])
q.put([2,‘22222‘])

while not q.empty():
    print(q.get())

队列的两个方法.join()和.task_done()  

两个方法必须配合使用

.join()方法阻塞进程,知道所有任务完成

.task_done()方法在每次队列执行完后必须添加

import queue,threading

q = queue.Queue()

def foo():
    q.put(111)
    q.put(222)
    q.put(333)
    q.join()
    print(‘ok‘)

def bar():
    print(q.get())
    q.task_done()   # 每取一个队列,必须执行一条task_done()
    print(q.get())
    q.task_done()
    print(q.get())
    q.task_done()

t1 = threading.Thread(target=foo,args=())
t1.start()

t2 = threading.Thread(target=bar,args=())
t2.start()
‘‘‘队列实例:生产者消费者模型生产者:创建数据的模型消费者:获取数据的模型

优点:    1、解耦合    2、实现并发‘‘‘
import queue,threading,time
import random

q=queue.Queue(50)

def Producer(id):
    count=1
    while count<10: # 一次可做10个包子
        if q.qsize()<20:    # 当包子数小于20个,厨师才做
            s=random.randint(1,100)   # 包子代号
            q.put(s)
            print(id+" has made baozi %s"%s)
            time.sleep(1)   # 此IO可切线程,每做一个包子换另一个厨师,直到做够最小包子数
            count+=1

def Consumer(id):

    while True:
         s=q.get()  # 取包子,s是代号
         print("Consumer "+id+" has eat %s"%s)
         time.sleep(2)

for i in range(10):
    t1=threading.Thread(target=Producer,args=(str(i),))
    t1.start()

for i in range(10):

    t=threading.Thread(target=Consumer,args=(str(i),))
    t.start()
时间: 2024-08-17 13:37:01

python3 线程_threading模块的相关文章

Python3.4 asyncio模块简介

这个模块提供了在单个线程上使用协程,适用基于网络及其他资源,有关IO密集型的服务端及客户端程序. 模块细节如下: 适用于多系统可拆卸的事件循环(event loop)系统: 数据传输(transport)和协议抽象(类似于Twisted): 对TCP.UDP.SSL.子进程管道.延时调用(delayed calls)和其他一些系统特有的传输协议支持的实现: a Future class that mimics the one in the concurrent.futures module, b

Python3.x标准模块库目录

Python3.x标准模块库目录 文本 1. string:通用字符串操作 2. re:正则表达式操作 3. difflib:差异计算工具 4. textwrap:文本填充 5. unicodedata:Unicode字符数据库 6. stringprep:互联网字符串准备工具 7. readline:GNU按行读取接口 8. rlcompleter:GNU按行读取的实现函数 二进制数据 9. struct:将字节解析为打包的二进制数据 10. codecs:注册表与基类的编解码器 数据类型 1

python基础系列教程——Python3.x标准模块库目录

python基础系列教程——Python3.x标准模块库目录 文本 string:通用字符串操作 re:正则表达式操作 difflib:差异计算工具 textwrap:文本填充 unicodedata:Unicode字符数据库 stringprep:互联网字符串准备工具 readline:GNU按行读取接口 rlcompleter:GNU按行读取的实现函数 二进制数据 struct:将字节解析为打包的二进制数据 codecs:注册表与基类的编解码器 数据类型 datetime:基于日期与时间工具

Python3之logging模块浅析

目录 Python3之logging模块浅析 简单用法 日志与控制台同时输出 一个同时输出到屏幕.文件的完成例子 日志文件截取 日志重复打印问题解决 问题分析 解决方案 1.使用不同的日志对象 2.及时清理(logger.handlers.clear) 3.使用前先判断是否有相同的handler对象 总结: Python3之logging模块浅析 很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志

python3使用csv模块读写csv文件

python3使用csv模块读写csv文件 读取csv文件: import csv #打开文件,用with打开可以不用去特意关闭file了,python3不支持file()打开文件,只能用open() with open("XXX.csv","r",encoding="utf-8") as csvfile: #读取csv文件,返回的是迭代类型 read = csv.reader(csvfile) for i in read: print(i) 存

【Nginx核心模块】线程池模块

本节研究Nginx中线程池模块的相关实现: 总体说明 (1)线程池模块属于核心模块,因此其配置内存ngx_thread_pool_conf_t将会预先申请好:ngx_thread_pool_conf_t中主要管理各个线程池结构: (2)在ngx_thread_pool_init_worker和 ngx_thread_pool_exit_worker分别会创建每一个线程池和销毁每一个线程池: 线程池模块 ngx_module_t ngx_thread_pool_module = { NGX_MOD

Python3 内建模块 hashlib、itertools、HTMLParser、urllib

Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示). 举个例子,你写了一篇文章,内容是一个字符串'how to use python hashlib - by Michael',并附上这篇文章的摘要是'2d73d4f15c0db7f5ecb321b6a65e5d6d'.如果有人篡改了你的文章,并发表为'how to use pytho

Python3 内建模块 datetime/collections/base64/struct

datetime 我们先看如何获取当前日期和时间: >>> from datetime import datetime >>> now = datetime.now() # 获取当前datetime >>> print(now) 2015-05-18 16:28:07.198690 >>> print(type(now)) <class 'datetime.datetime'> 注意到datetime是模块,datetim

python3.7 time模块

#!/usr/bin/env python __author__ = "lrtao2010" #python3.7 time模块 #time模块没有time.py文件,是内置到解释器中的模块 #三种时间表示方式 ''' 1.时间戳(timestamp): 通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量. 2.格式化的时间字符串:"2018-09-03 10:02:01" 3.元组(struct_time):struct_time元组