11 线程进程协程

1 线程

1.1 基本应用

1.1.1 标准线程(常用)

import threading
def f1(arg):
    print(arg)

t = threading.Thread(target=f1, args=(123,))
t.start()

1.1.2 自定义线程

自定义线程类既threading.Thread流程,自定义run方法

import threading
class MyThread(threading.Thread):  #自定义类,继承threading.Thread类
    def __init__(self, func, args):
        self.func = func
        self.args = args
        super(MyThread, self).__init__()

    def run(self):  #定义run方法
        self.func(self.args)
def f2(arg):
    print(arg)

obj = MyThread(f2, 123)
obj.start()

1.2 队列queue

1.2.1 队列类型

  • queue.Queue先进先出队列
  • queue.LifoQueue后进先出队列
  • queue.PriorityQueue优先级队列
  • queue.deque双向队列

1.2.2 queue.Queue先进先出队列

参数

put放数据(默认阻塞),是否阻塞,阻塞时的超时时间

get取数据(默认阻塞),是否阻塞,阻塞时的超时时间

queue.Queue(n),n队列最大长度

empty() #检查队列是否为空

qsize() #真实个数

maxsize()  #最大支持的个数

join()  #队列中的任务全部完成之后(元素没有被完成(取出))

task_done()  #结束取值任务

import queue

q = queue.Queue(3)  # 定义队列,最多可放10个数据
q.put(11)  # put存放数据
q.put(22)
q.put(33,block=False, timeout=2)  # 默认block阻塞,timeout超时时间

print(q.qsize())  # 真实数据个数
print(q.empty())  #查看队列是否为空
print(q.get())
q.task_done()  #结束取值任务
print(q.get())
q.task_done()  #结束取值任务
print(q.get(block=False, timeout=2)) # 默认block阻塞,timeout超时时间
q.task_done()  #结束取值任务
print(q.empty())  #查看队列是否为空
q.join()  # 阻塞进程,当队列中任务执行完毕后不再阻塞,与task_done()配合使用

1.2.3 后进先出队列

q = queue.LifoQueue()
q.put(123)
q.put(456)
q.put(789)
print(q.get())

# 789
# 456
# 123

1.2.4 优先级队列

q = queue.PriorityQueue()
q.put((1, "alex4"))
q.put((1, "alex3"))
q.put((2, "alex2"))
q.put((0, "alex0"))
q.put((1, "alex1"))
print(q.get())
print(q.get())
print(q.get())
print(q.get())

# (0, ‘alex0‘)
# (1, ‘alex1‘)
# (1, ‘alex3‘)
# (1, ‘alex4‘) 

PS:如果优先级ID相同,按参数排序 

1.2.5 双向队列

q = queue.deque()
q.append(123)
q.append(456)
q.appendleft(789)
print(q.pop())
print(q.popleft())

# 456
# 789

1.3 生产者消费者模型(队列的应用)

import queue
import threading
import time

q = queue.Queue()

def productor(arg):
    """
    买票
    :param arg:
    :return:
    """
    q.put(str(arg)+ ‘票‘)

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

def consumer(arg):
    """
    服务器后台
    :param arg:
    :return:
    """
    while True:
        print(arg, q.get())
        time.sleep(2)

for j in range(3):
    t = threading.Thread(target=consumer, args=(j, ))
    t.start()

  

1.4 线程锁(Lock,RLock)

1.5 信号量()

1.6 事件(event)

1.7 条件(Condition)

1.8 Timer

1.9 线程池

第2章 进程

2.1 基本使用

2.2 进程数据共享

2.2.1 queues(队列)数据共享

2.2.2 array(数组)

2.2.3 Manager.dict(字典)

2.3 进程锁

2.4 进程池

2.5 小结

第3章 协程

3.1 greenlet

3.2 gevent

3.3 Windows安装gevent

import queue

q = queue.Queue(3)  # 定义队列,最多可放10个数据
q.put(11)  # put存放数据
q.put(22)
q.put(33,block=False, timeout=2)  # 默认block阻塞,timeout超时时间

print(q.qsize())  # 真实数据个数
print(q.empty())  #查看队列是否为空
print(q.get())
q.task_done()  #结束取值任务
print(q.get())
q.task_done()  #结束取值任务
print(q.get(block=False, timeout=2)) # 默认block阻塞,timeout超时时间
q.task_done()  #结束取值任务
print(q.empty())  #查看队列是否为空
q.join()  # 阻塞进程,当队列中任务执行完毕后不再阻塞,与task_done()配合使用
时间: 2024-08-03 23:35:33

11 线程进程协程的相关文章

Python的线程&进程&协程[0] -> 基本概念

基本概念 / Basic Concept 0 简介与动机 / Why Multi-Thread/Multi-Process/Coroutine 在多线程(multithreaded, MT)编程出现之前,计算机程序的执行是由单个步骤序列组成的,该序列在主机的CPU中按照同步顺序执行.即无论任务多少,是否包含子任务,都要按照顺序方式进行. 然而,假定子任务之间相互独立,没有因果关系,若能使这些独立的任务同时运行,则这种并行处理方式可以显著提高整个任务的性能,这便是多线程编程. 而对于Python而

15.python并发编程(线程--进程--协程)

一.进程:1.定义:进程最小的资源单位,本质就是一个程序在一个数据集上的一次动态执行(运行)的过程2.组成:进程一般由程序,数据集,进程控制三部分组成:(1)程序:用来描述进程要完成哪些功能以及如何完成(2)数据集:是程序在执行过程中所需要使用的一切资源(3)进程控制块:用来记录进程外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志.3.进程的作用:是想完成多任务并发,进程之间的内存地址是相互独立的二.线程:1.定义:最小的执行单位,线程的出现是为了

线程 进程 协程

一.什么是线程? 线程是操作系统能够进行运算调度的最小单位(程序执行流的最小单元).它被包含在进程之中,是进程中的实际运作单位.一条线程指的是一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. 一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成.另外,线程是进程的中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源.一个线程可以创建和撤销另一

第九天 线程 进程 协程 队列

详细链接http://www.cnblogs.com/alex3714/articles/5230609.html 1.线程:包含在进程中,是操作系统运算调度的最小单位,是一串指令的集合,直接与cpu交互 2进程:进程是一个程序各种资源的集合.操作系统通过管理这个集合进而运行程序,进程本身并不执行,进程通过调用线程来调度cpu. 3.不同点: 一个线程可以控制和操作同一进程里的其他线程,但是进程只能操作子进程 创建新线程很简单,但是创建一个子进程需要对父进程进行拷贝 线程共享内存,进程的内存是独

Python的线程&进程&协程[0] -> 线程 -> 多线程的建立与使用

常用的多线程功能实现 目录 生成线程的三种方法 单线程与多线程对比 守护线程的设置 1 生成线程的三种方法 三种方式分别为: 创建一个Thread实例,传给它一个函数 创建一个Thread实例,传给它一个可调用的类实例 派生Thread的子类,并创建子类的实例 # There are three ways to create a thread # The first is create a thread instance, and pass a function # The second one

Python的线程&进程&协程[0] -> 线程 -> 多线程锁的使用

锁与信号量 目录 添加线程锁 锁的本质 互斥锁与可重入锁 死锁的产生 锁的上下文管理 信号量与有界信号量 1 添加线程锁 由于多线程对资源的抢占顺序不同,可能会产生冲突,通过添加线程锁来对共有资源进行控制. 1 import atexit 2 from random import randrange 3 from threading import Thread, Lock, current_thread # or currentThread 4 from time import ctime, s

Python的线程&进程&协程[1] -> 线程 -> 多线程的控制方式

多线程的控制方式 目录 唤醒单个线程等待 唤醒多个线程等待 条件函数等待 事件触发标志 函数延迟启动 设置线程障碍 1 唤醒单个线程等待 Condition类相当于一把高级的锁,可以进行一些复杂的线程同步控制.一般Condition内部都有一把内置的锁对象(默认为RLock),对于Condition的使用主要有以下步骤: 建立两个线程对象,及Condition对象; 线程1首先获取Condition的锁权限,acquire(); 线程1执行需要完成的任务后,调用等待wait(),此时,线程1会阻

Python的线程&进程&协程[2] -> 进程 -> 多进程的基本使用

多进程的基本使用 1 subprocess 常用函数示例 首先定义一个子进程调用的程序,用于打印一个输出语句,并获取命令行参数 1 import sys 2 print('Called_Function.py called, Hello world.') 3 try: 4 print('Got para', sys.argv[1:]) 5 except: 6 pass 再定义主函数,即父进程,分别测试 run() / call() / check_call() / getstatusoutput

Python 中的进程、线程、协程、同步、异步、回调

进程和线程究竟是什么东西?传统网络服务模型是如何工作的?协程和线程的关系和区别有哪些?IO过程在什么时间发生? 在刚刚结束的 PyCon2014 上海站,来自七牛云存储的 Python 高级工程师许智翔带来了关于 Python 的分享<Python中的进程.线程.协程.同步.异步.回调>. 一.上下文切换技术 简述 在进一步之前,让我们先回顾一下各种上下文切换技术. 不过首先说明一点术语.当我们说"上下文"的时候,指的是程序在执行中的一个状态.通常我们会用调用栈来表示这个状