python---进程、线程
一、进程
二、线程
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---进程、线程的更多相关文章
- python/进程线程的总结
python/进程线程的总结 一.进程和线程的描述: 进程:最小的资源管理单位 线程:最小的执行单位 执行一个进程时就默认执行一个线程(主线程) 进程和线程的工作方式: 串行: 假如共有A.B.C任务 ...
- Python 进程线程协程 GIL 闭包 与高阶函数(五)
Python 进程线程协程 GIL 闭包 与高阶函数(五) 1 GIL线程全局锁 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的 ...
- python 进程 线程
进程 线程 操作系统 为什么要有操作系统? 操作系统:操作系统是一个用来协调,管理和控制计算机硬件和软件资源的系统程序.位于底层硬件与应用软件之间 工作方式:向下管理硬件 向上提供接口 切换 1.出现 ...
- Python 进程 线程总结
操作系统的底层是 进程 线程 实现的 进程 操作系统完成系统进程的切换,中间有状态的保存.进程有自己独立的空间,进程多,资源消耗大 进程是最小的资源管理单位 可以理解为盛放线程的容器 线程 线程是最小 ...
- python进程.线程和协程的总结
I.进程: II.多线程threading总结 threading用于提供线程相关的操作,线程是应用系统中工作的最小单位(cpu调用的最小单位). Python当前版本的多线程没有实现优先级,线程组, ...
- python -- 进程线程协程专题
进程专栏 multiprocessing 高级模块 要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识. Unix/Linux操作系统提供了一个fork() ...
- python 进程 线程 协程
并发与并行:并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔内发生.在单核CPU下的多线程其实都只是并发,不是并行. 进程是系统资源分配的最小单位,进程的出现是为了更好的 ...
- python进程/线程/协程
一 背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所 ...
- python 进程/线程/协程 测试
# Author: yeshengbao # -- coding: utf-8 -- # @Time : 2018/5/24 21:38 # 进程:如一个人拥有分身(分数数最好为cpu核心数)几乎同时 ...
- python学习笔记-进程线程
1.什么是进程(process)? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述 ...
随机推荐
- Ajax 提交session实效跳转到完整的登陆页面
在spring security 中 Ajax提交时,session超时,局部加载登陆页面,为解决这个问题,重写ajax提交,返回的是modeview或者没有制定datatype时; 如果检测到加载到 ...
- apache 使用 .htaccess 导致500错误
今天在win主机上配置了一个apache+mysql+php 的环境,一切看似正常了.结果将程序转移过来,打开网站的时候,出现了500错误.于是乎查原因: 首先,怀疑的是连接mysql出错了,找出配置 ...
- Django Form and Modelform Admin定义 高级查询)
Django的form表单一般具有两种功能 1. 验证输入 2.输入HTML ---------模板----------- from django import forms class BookFor ...
- [I2C]I2C总线协议图解
转自:http://blog.csdn.net/w89436838/article/details/38660631 1 I2C总线物理拓扑结构 I2C 总线在物理连接上非常简单,分别由S ...
- Spark数据传输及ShuffleClient(源码阅读五)
我们都知道Spark的每个task运行在不同的服务器节点上,map输出的结果直接存储到map任务所在服务器的存储体系中,reduce任务有可能不在同一台机器上运行,所以需要远程将多个map任务的中间结 ...
- jquery 实现重复点击一个元素时不重复执行效果
jquery 实现重复点击一个元素时不重复执行效果 这需要用到jquery的stop方法 实例 停止当前正在运行的动画: $("#stop").click(function(){ ...
- CentOS 下 sftp 有人能连有人不能连 程序设定了禁用IP
问题现象: 局域网的一台Linux上运行有sftp Server. 大家用FileZilia 连接,有两个人能够连接,有两个人不能连接. 解决问题: 1.先查看服务器上的sftp server是哪一个 ...
- 从感知器到SVM
这篇文章主要是分析感知器和SVM处理分类问题的原理,不涉及求解 感知器: 感知器要解决的是这样的一个二分类问题:给定了一个线性可分的数据集,我们需要找到一个超平面,将该数据集分开.这个超平面的描述如下 ...
- Logstash5.0.X离线安装插件报错,仍然提示无法联网
本人最初将此解决方案发布在 ELK中文社区 http://elasticsearch.cn/question/1046 由于生产环境无法连接互联网,所有再一台联网机器上将所有插件做了 pack 拖到生 ...
- vim入门过程
先下载了一本VIM的用户手册. 看到可以使用vimtutor(VIM的入门教程,很不错,由浅入深)作为入门. Unix系统中,请在命令行输入:vimtutor,进入教程. MS-Windows系统中, ...