目录

线程与进程概念

进程

线程

线程与进程状态

协程

总体

线程例

基本操作

全局变量操作

进程例


线程与进程概念

进程

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动。是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中。

线程

线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流。

线程与进程状态

进程退出时该进程所产生的线程都会被强制退出并清除线程可与属于同一进程的其它线程共享进程所拥有的全部资源
但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)。

多进程适合在CPU 密集型操作(cpu 操作指令比较多,如科学计算,位数多的浮点运算)
多线程适合在IO 密集型操作(读写数据操作较多的,比如爬虫)
线程是并发进程是并行进程之间相互独立,是系统分配资源的最小单位,同一个进程中的所有线程共享资源。

协程

协程是用户态的轻量级线程,调度有用户控制,拥有自己的寄存器上下文和栈,切换基本没有内核切换的开销,切换灵活。

总体

  1. 一个进程中可以并发多个线程,每条线程并行执行不同的任务。
  2. 进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
  3. 线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间。
  4. 线程是并发,进程是并行。

线程例

基本操作

#线程基本操作
import threading
import time
def cxk(n):print('运行线程:',n)for i in range(10):# 创建10个线程t = threading.Thread(target=cxk, args=(i,))    # 线程运行的函数和参数t.setDaemon(True) # 设置为守护线程(在主线程线程结束后自动退出,默认为False即主线程线程结束后子线程仍在执行)t.start() # 启动线程输出:
运行线程: 0
运行线程: 1
运行线程: 2
运行线程: 3
运行线程: 4
运行线程: 5
运行线程: 6
运行线程: 7
运行线程: 8
运行线程: 9

全局变量操作

import threading,time
def cxk(n):global jj+=1time.sleep(1)print('运行线程:%s,变量j的情况:%s'%(n,j))
j=-1
for i in range(10):# 创建10个线程t = threading.Thread(target=cxk, args=(i,))    # 线程运行的函数和参数t.setDaemon(True) # 设置为守护线程(在主线程线程结束后自动退出,默认为False即主线程线程结束后子线程仍在执行)t.start() # 启动线程

如果处理速度比较快并不会出现脏数据的情况
>>>
运行线程:0,变量j的情况:0
运行线程:1,变量j的情况:1
运行线程:2,变量j的情况:2
运行线程:3,变量j的情况:3
运行线程:4,变量j的情况:4
运行线程:5,变量j的情况:5
运行线程:6,变量j的情况:6
运行线程:7,变量j的情况:7
运行线程:8,变量j的情况:8
运行线程:9,变量j的情况:9

但是当我们每个进程睡眠加个进去,time.sleep(1),相当于处

理速度比较慢的时候,就会变成下面这样,因为操作的全部线程执行完后第一个线程打印部分还在睡眠,当他打印j变量的时候全部线程已经执行完毕了
>>>
运行线程:0,变量j的情况:9
运行线程:1,变量j的情况:9
运行线程:3,变量j的情况:9
运行线程:5,变量j的情况:9
运行线程:4,变量j的情况:9
运行线程:8,变量j的情况:9
运行线程:7,变量j的情况:9
运行线程:2,变量j的情况:9
运行线程:9,变量j的情况:9
运行线程:6,变量j的情况:9

解决办法就是加锁

# 线程锁
import threading,time
def cxk(n):lock.acquire()      # 开始锁global jj+=1time.sleep(1)print('运行线程:%s,变量j的情况:%s'%(n,j))lock.release()      # 结束锁
j=-1
lock = threading.RLock()    # 定义线程锁
for i in range(10):# 创建10个线程t = threading.Thread(target=cxk, args=(i,))    # 线程运行的函数和参数t.setDaemon(True) # 设置为守护线程(在主线程线程结束后自动退出,默认为False即主线程线程结束后子线程仍在执行)t.start() # 启动线程#输出
>>>
运行线程:0,变量j的情况:0
运行线程:1,变量j的情况:1
运行线程:2,变量j的情况:2
运行线程:3,变量j的情况:3
运行线程:4,变量j的情况:4
运行线程:5,变量j的情况:5
运行线程:6,变量j的情况:6
运行线程:7,变量j的情况:7
运行线程:8,变量j的情况:8
运行线程:9,变量j的情况:9

那么多线程处理文件的时候会出现文件资源出现问题的情况吗?我们来为每个线程同时向同一个文件写十句话。

import threading,time
def cxk(n):with open('cxk.txt','a+') as f:for i in range(0,10):time.sleep(1)f.write('我是线程:%s \n'%str(n))print('线程:%s 写入成功'%str(n))
for i in range(10):# 创建10个线程t = threading.Thread(target=cxk, args=(i,))    # 线程运行的函数和参数t.setDaemon(True) # 设置为守护线程(在主线程线程结束后自动退出,默认为False即主线程线程结束后子线程仍在执行)t.start() # 启动线程

由图可以看出没什么问题,并没出现同一文件不能处理,我们加大处理速度试试,睡眠 。

也没什么问题,就是线程完成速度不一样,并没出现第一个线程写完第一句第二个线程接着写第二句,但是这样看起来不像是并行,倒像是串行的。。。我就在想会不会是在并行的情况下,第一个线程睡眠时第二个线程也是同时处于睡眠状态,所以写入也是按顺序的。。。不过我在网上得到下面这一段话:
"""
在Python的原始解释器CPython中存在着GIL,因此在解释执行Python代码时,会产生互斥锁来限制线程对共享资源的访问,直到解释器遇到I/O操作或者操作次数达到一定数目时才会释放GIL,所以有GIL效果就是:** 一个进程内同一时间只能允许一个线程进行运算 ** (这尼玛不就是单线程吗?)

python的多线程只能在一个核心上跑(创始人没想到会有多核出现),就是单核的上下文切换,所以很鸡肋。
于是协程在python大展拳脚,好多框架都是使用协程来解决多任务的,而不是线程(scrapy,tornado)。

"""
最后似懂非懂,也就是说到底python的多线程就不是真正的并行。。。

不过python的多线程确实能提升效率,并且使用tkinter时打开不同窗口使用多线程不会产生卡住状态,这篇博客也采用多线程处理,效率大大提升,还有以前的tkinter练习也基本用到了,有兴趣可以去看看。

进程例

进程我用的不多,因为我用notebook运行多进程时只有主进程会显示,子进程调用的函数没反应,只能打包成py文件去cmd下运行。

#写入该句话,运行时直接生成py文件
%%writefile cxkkxc.py
import multiprocessing,time
"""
进程各自持有一份数据,默认无法共享数据
当创建进程时(非使用时),共享数据会被拿到子进程中,当进程中执行完毕后,再赋值给原值。
"""
def cxk(n):with open('cxk2.txt','a+') as f:for i in range(0,10):f.write('我是进程:%s \n'%str(n))time.sleep(1)print('进程:%s 写入成功'%str(n))if __name__ == "__main__":for i in range(1,3):p = multiprocessing.Process(target = cxk, args = (i,))p.start()print("p.pid:", p.pid)print ("p.name:", p.name)print ("p.is_alive:", p.is_alive())

这里我试用的也是打开文件的形式,只不过是以with open打开的,加了睡眠没有加锁也没出现资源共享问题,搞不懂搞不懂,可能with open 会自动关闭文件吧,每写完一句关闭第二个进程再打开写入。以后再探究探究。最近可能没空咯,参加了一个比赛,等忙完这阵再继续更。

例子简单了解线程与进程相关推荐

  1. 简单了解线程和进程、多进程和多线程、并发和并行的区别

    一:线程与进程 1.概念 线程:是程序执行流的最小单元,是系统独立调度和分配CPU(独立运行)的基本单位. 进程:是资源分配的基本单位.一个进程包括多个线程. 2.区别: 1.线程与资源分配无关,它属 ...

  2. 简单介绍线程和进程区别

    一.线程 线程是资源调度的基本单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资 ...

  3. 对线程与进程的区别以及对多线程并发的理解

    一.线程与进程的区别 先简单说说线程与进程的概念: (1)进程是指一个内存中运行的应用程序,比如在Windows系统中,一个运行的exe就是一个进程. (2)线程是指进程中的一个执行流程. 区别: 一 ...

  4. 线程与进程,你真的清楚吗?

    作者 | 码农的荒岛求生 头图 | CSDN 下载自视觉中国 来源 | 码农的荒岛求生(ID:escape-it) 进程和线程这两个话题是程序员绕不开的,操作系统提供的这两个抽象概念实在是太重要了. ...

  5. 一个简单的例子看java线程机制

    一个简单的例子看java线程机制 作者: zyf0808 发表日期: 2006-03-26 11:20 文章属性: 原创 复制链接 import java.util.*; public class T ...

  6. linux 线程与进程的简单区别

    一.进程与线程的区别 一个进程至少包含一个线程,线程可以在同一时刻做不止一件事情:进程是线程的容器,里面可以包含很多个线程. 进程:是资源分配的最小单位 线程:是程序执行的最小单位 区别一: 进程:父 ...

  7. python中线程和进程_python中线程和进程的简单了解

    一.操作系统.应用程序 1.硬件:硬盘.cpu.主板.显卡........ 2.装系统(本身也是一个软件): 系统就是一个由程序员写出来的软件,该软件用于控制计算机得硬盘,让他们之间进行互相配合. 3 ...

  8. 2012-5-3 线程和进程的区别

    进程和线程的区别 http://www.cnblogs.com/lmule/archive/2010/08/18/1802774.html 简而言之,一个程序至少有一个进程,一个进程至少有一个线程. ...

  9. Python 09--多线程、进程

    本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者 ...

最新文章

  1. 用C语言实现素数筛法获取一亿(100000000)以内的全部素数
  2. donsker定理_中心极限定理和Donsker定理
  3. C#如何在钉钉开发平台中创建部门
  4. 08 ORA系列:ORA-01861 文字与格式字符串不匹配
  5. TopPaper:AI 初学者经典论文列表
  6. Luogu P3455 [POI2007]ZAP-Queries
  7. 【STM32】ESP8266 AT指令
  8. 用过哪些Map类,都有什么区别,HashMap是线程安全的吗,并发下使用的Map是什么,他们内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。
  9. BZOJ1061: [Noi2008]志愿者招募(线性规划)
  10. python设计一个爱心_python画一个玫瑰和一个爱心
  11. python 并发编程 socket 服务端 客户端 阻塞io行为
  12. c语言 while 怎样用,C语言 while 的用法
  13. Docker Macvlan
  14. 离开马云后,20位阿里人的区块链创业路
  15. [青海、甘南之行散记] 当风吹过高原,一颗心在说话
  16. Doctrine 查询语法
  17. JPBC实现非对称双线性配对:typeF型曲线
  18. Directsound 与 Waveout 有何不同
  19. linux把m4s格式转换mp4,史上最详细!如何将B站缓存的m4s文件无损转换为mp4格式
  20. 对激光原理的初步了解

热门文章

  1. 技美 百人计划 (图形)1.1渲染流程
  2. 第二季 明文封包教程
  3. MySQL所有的字段类型,可能是最全的字段类型说明
  4. QD77MS4 RD77MS4 运动控制模块凸轮曲线样例程序
  5. 研究生学姐二次考研的感悟:关于择校选专业专硕or学硕
  6. oracle网页怎么翻译成中文,sql语句翻译成中文小工具
  7. FPGA纯verilog实现UDP通信,三速网自协商仲裁,动态ARP和Ping功能,提供工程源码和技术支持
  8. 华为设备配置Hub and Spoke
  9. mysql 查询成绩排名_mysql 学生成绩查询排名
  10. 2016年9月2日 星期五 --出埃及记 Exodus 16:34