一、进程

二、线程

1,使用Thread类创建线程

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'zhoufeng'

import threading
import time

def f1(arg):
    time.sleep(5)
    print(arg)

t=threading.Thread(target=f1,args=(123,))  #target表示让线程干什么活,args是参数
t.start()   #线程进入准备状态,等待CPU调度
print('end')

'''
输出如下:
end
123
'''

#主线程执行到最后了  但程序未退出,在等待子程序执行完

2,主线程默认是等待子线程执行完毕后再退出的,也可以通过setDaemon方法设置成主线程不等待子线程

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'zhoufeng'

import threading
import time

def f1(arg):
    time.sleep(5)
    print(arg)

t=threading.Thread(target=f1,args=(123,))  #target表示让线程干什么活,args是参数
t.setDaemon(True)   #设置主线程不等子线程
t.start()   #线程进入准备状态,等待CPU调度
print('end')

'''
输出如下:
end
'''

#主线程执行完后就退出了

3,前面的setDaemon方法只能决定等不等待子线程执行完,更为灵活的join方法能指定在什么位置等待,最多等待多久(即便子进程未执行完也继续往下执行)

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'zhoufeng'

import threading
import time

def f1(arg):
    time.sleep(5)
    print(arg)

t=threading.Thread(target=f1,args=(123,))
t.setDaemon(True)
t.start()
t.join(2)   #表示主线程执行到这里暂停,等待子进程执行,最多等待2秒

print('end')

'''
输出如下:
end
'''
#在本例中无法等待子进程执行完毕,子进程耗时5秒,而主进程只会等待2秒
#join方法和setDaemon方法不冲突

4,另外一种创建线程的方法

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'zhoufeng'

import threading

class MyTread(threading.Thread):  #自定义线程类,继承Thread类
    def __init__(self,func,args):   #重写__init__方法
        self.func=func
        self.args=args
        super(MyTread,self).__init__()  #执行父类的__init__方法

    def run(self):  #重写run方法
        self.func(self.args)

def f2(arg):
    print(arg)

obj=MyTread(f2,123)  #实例化一个线程对象
obj.start()   #执行线程对象的start方法,等待cpu调度

5,线程锁

线程锁相当于在电话亭排队打电话,一次只让一个人进去,后面的人等着

不加锁的情况,会发现多个线程会同时修改数据,导致脏数据

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'zhoufeng'

import threading
import time
NUM=10

def func():
    global NUM     #在函数内(更低的作用域)修改全局变量,需要声明此处操作的是全局变量
    NUM-=1
    time.sleep(2)
    print(NUM)

for i in range(10):
    t=threading.Thread(target=func,)
    t.start()

#输出结果如下:
'''
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
'''

如果多个线程去做同一个操作,对该操作加锁之后,必须等上一个线程处理完,下一个线程才能开始处理

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'zhoufeng'

import threading
import time
NUM=10

def func(l):
    global NUM     #在函数内(更低的作用域)修改全局变量,需要声明此处操作的是全局变量
    l.acquire()    #上锁
    NUM-=1
    time.sleep(2)
    print(NUM)
    l.release()    #开锁

lock=threading.RLock()

for i in range(10):
    t=threading.Thread(target=func,args=(lock,))
    t.start()

#输出结果如下:
'''
    9
    8
    7
    6
    5
    4
    3
    2
    1
    0
'''

6,信号量

信号量相当于排队玩过山车 ,一共30个人,一次只让5个人上去

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'zhoufeng'

import threading
import time
NUM=10

def func(l,i):
    global NUM     #在函数内(更低的作用域)修改全局变量,需要声明此处操作的是全局变量
    l.acquire()    #上锁
    NUM-=1
    time.sleep(2)
    print(NUM,i)
    l.release()    #开锁

lock=threading.BoundedSemaphore(5)  #使用BoundedSemaphore类创建信号量对象,5表示每次允许5个线程执行

for i in range(30):
    t=threading.Thread(target=func,args=(lock,i))
    t.start()

7,事件

事件相当于过马路,出现绿灯后,所有人都可以过去

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'zhoufeng'

import threading
def func(i,e):
    print(i)
    e.wait()   #程序暂停,检查是什么灯(事件是否发生),红灯停,绿灯行
    print(i+100)

event=threading.Event()   #定义一个事件对象

for i in  range(10):
    t=threading.Thread(target=func,args=(i,event))
    t.start()

event.clear()    #设置成红灯,默认是红灯
inp=input(">>>>")
":
    event.set()     #设置成绿灯

8,线程池

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'zhoufeng'

#线程池用于控制并发线程数,因为不是线程数越多越好,最好等于CPU核心数,减少上下文切换带来的开销
#python中无线程池类,需要自定义
#让我想起了shell中的管道用法

import threading
import queue
import time

class ThreadPool:   #定义一个线程池类
    def __init__(self,maxsize=5):
        self.maxsize=maxsize
        self._q=queue.Queue(maxsize)    #定义一个队列,能放5个元素
        for i in range(maxsize):
            self._q.put(threading.Thread)     #将线程类放入队列

    def get_thread(self):    #取队列元素:返回一个线程类
        return self._q.get()

    def add_thread(self):   #放入元素
        self._q.put(threading.Thread)

pool=ThreadPool(5)    #创建线程池对象

def task(arg,p):
    print(arg)
    time.sleep(1)
    p.add_thread()   #执行完一个任务就往线程池中再放入一个元素

for i in range(100):
    t=pool.get_thread()   #如果线程池中已无元素,程序会夯住
    obj=t(target=task,args=(i,pool,))
    obj.start()

python---进程、线程的更多相关文章

  1. python/进程线程的总结

    python/进程线程的总结 一.进程和线程的描述: 进程:最小的资源管理单位 线程:最小的执行单位 执行一个进程时就默认执行一个线程(主线程) 进程和线程的工作方式: 串行: 假如共有A.B.C任务 ...

  2. Python 进程线程协程 GIL 闭包 与高阶函数(五)

    Python 进程线程协程 GIL 闭包 与高阶函数(五) 1 GIL线程全局锁 ​ 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的 ...

  3. python 进程 线程

    进程 线程 操作系统 为什么要有操作系统? 操作系统:操作系统是一个用来协调,管理和控制计算机硬件和软件资源的系统程序.位于底层硬件与应用软件之间 工作方式:向下管理硬件 向上提供接口 切换 1.出现 ...

  4. Python 进程 线程总结

    操作系统的底层是 进程 线程 实现的 进程 操作系统完成系统进程的切换,中间有状态的保存.进程有自己独立的空间,进程多,资源消耗大 进程是最小的资源管理单位 可以理解为盛放线程的容器 线程 线程是最小 ...

  5. python进程.线程和协程的总结

    I.进程: II.多线程threading总结 threading用于提供线程相关的操作,线程是应用系统中工作的最小单位(cpu调用的最小单位). Python当前版本的多线程没有实现优先级,线程组, ...

  6. python -- 进程线程协程专题

    进程专栏 multiprocessing 高级模块 要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识. Unix/Linux操作系统提供了一个fork() ...

  7. python 进程 线程 协程

    并发与并行:并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔内发生.在单核CPU下的多线程其实都只是并发,不是并行. 进程是系统资源分配的最小单位,进程的出现是为了更好的 ...

  8. python进程/线程/协程

    一 背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所 ...

  9. python 进程/线程/协程 测试

    # Author: yeshengbao # -- coding: utf-8 -- # @Time : 2018/5/24 21:38 # 进程:如一个人拥有分身(分数数最好为cpu核心数)几乎同时 ...

  10. python学习笔记-进程线程

    1.什么是进程(process)? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述 ...

随机推荐

  1. .NET批量删除代码前的行号

    1 EmEditor Pro.EditPlus .visual studio   ,把有行号的代码粘贴进去,按住键盘的Alt键,然后用鼠标拖出选择框列选行号,最后按Delete删除行号; 2 使用正则 ...

  2. ubuntu修改主机名

    ubuntu修改主机名   主机名在/etc/hostname文件中了,只在打开这个文件进行修改,重启计算机即可.     一.查看主机名 $ hostname  #查看主机名 cdyemail   ...

  3. 选盘秘籍:用户如何选择SSD/SATA/SAS?

    先学习下一些专业词汇 IDE (Integrated Drive Electronics) 电子集成驱动器 它的本意是指把"硬盘控制器"与"盘体"集成在一起的硬 ...

  4. php入门part3

    php函数 php函数和JScript的函数大同小异,这里主要强调一下不同之处. 函数的定义:function函数名(形参类表){ 函数体 } 函数的调用:函数名(实参类表) 在php里函数可以先调用 ...

  5. coderforces 721b

    题目描述: B. Passwords time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  6. 基于Material Design(转载)

    SeeNewsV2新闻Android客户端 基于Material Design http://www.codesocang.com/gn/xiangmu/33630.html 直接拿来用!十大Mate ...

  7. PSP(11.24~11.30)

    27号 类别c 内容c 开始时间s 结束e 中断I 净时间T 作业 构建执法.写博客 14:00 14:40 0m 40m 28号 类别c 内容c 开始时间s 结束e 中断I 净时间T java 编码 ...

  8. prim算法查找最小生成树

    我们在图的定义中说过,带有权值的图就是网结构.一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边.所谓的最小成本,就是n个顶点,用n-1条边把一个连通图连接 ...

  9. jQuery MiniUI开发系列之:Ajax处理超时、服务端错误

    MiniUI所有组件的ajax交互,均使用标准.成熟的jQuery.ajax. 依赖于jquery ajax组件的完善性,我们可以拦截住每一次ajax请求处理. 比如,拦截ajax返回数据前,判断返回 ...

  10. 【解决】AWS服务控制台中上传文件失败

    使用IE 11,在 AWS Services Console 中不管是 S3 还是 Elastic Beanstalk 的页面中上传页面都会失败,提示信息如下: A problem occurred ...