内容回顾

  socket

    最底层的网络通信

    所有的网络通信都是基于socket

     进程

    什么是进程?

    是操作系统的发展过程中,为了提高cpu的利用率,在操作系统同时运行多个程序的时候,为了数据的安全\代码不混乱而创造的一个概念

    每一个程序运行起来都至少是一个进程

    进程是计算机中最小的资源分配单位

    进程被操作系统调度的,有很多相关的算法--早期的操作系统

    进程之间是数据隔离的

    进程的三状态  就绪  运行  阻塞

    同步异步

      同步:一个任务的执行依赖另一个事务的结束

        join  lock

      异步:一个任务的执行不依赖另一个事务的结束

        start terminate

    阻塞非租塞

      阻塞 :accept recv recvfrom  queue.get   join

      非租塞: setblocking = False

    并发并行

      并行是特殊的并发

      并行就是  同一时刻 两个以上的程序同时在cpu上执行

      并发就是  同一时段 两个以上的程序看起来在同时执行

    IO概念: 文件操作  数据库操作  网络传输  用户输入输出

       Input    得到bytes/str

         Output  发送数据/输出数据

因为进程与进程之间本质上是异步且数据隔离

守护进程:子进程等待主进程的代码结束就结束了

同步控制

    join

    锁 -互斥锁: 多个进程同时对一个数据进行操作的时候,操作同一个文件/数据库/管道/Manager.dict

    信号量

    事件

数据共享 - 数据不安全

    Manager

IPC-进程之间通信

    管道

    队列 - 生产者消费者模型(为了解决数据的生产和处理的效率问题)

    第三方工具(消息队列,消息中间件)

进程池

    解决大量任务 开启多个进程的开销过大的问题

    节省资源,提高并发效率的

    一般开进程数 cpu_count  *1 or 2

今日内容

初识进程

为什么要有线程

线程在操作系统中有什么特点

线程在python语言中有什么特点

GIL全局解释器锁

  为什么要有全局解释器锁

在python中如何开启线程

线程的基础的使用

线程的概念

# 多进程 socket server
# 只要来了一个client请求 开一个进程
# 进程开多了就会卡
# 进程的调度
# 进程的开启的开销
# 给操作系统的负担 # 数据\文件\代码
# 记录当前的执行位置 # 假设有一个机制
# 开启进程的开销变短
# 调度的时间也变短
# 操作系统减负 # 线程是计算机中被CPU调度的最小单位
# 线程 : 轻量级的进程/轻型进程
# 线程本身创建出来就是为了解决并发问题的
# 并且它的整体效率比进程要高
# 但是线程实际上也有一些性能上的限制\管理调度开销 # 在整个程序界:
# 如果你的程序需要数据隔离 : 多进程
# 如果你的程序对并发的要求非常高 : 多线程
# socketserver 多线程的
# web的框架 django flask tornado 多线程来接收用户并发的请求 # 线程
# 轻量级
# 在进程中数据共享
# 是进程的一部分,不能独立存在的
# 计算机中能被CPU调度的最小单位 # 进程
# 对操作系统的压力大
# 数据隔离
# 可以在操作系统中独立存在
# 计算机中资源分配的最小单位 # 在整个编程界
# 同一个进程中的多个线程能不能同时使用多个cpu # python
# 单核的 一个cpu
# 多核的 作为一门脚本语言 # 线程锁这件事儿是有Cpython解释器完成
# 对于python来说 同一时刻只能有一个线程被cpu访问
# 彻底的解决了多核环境下的安全问题
# 线程锁 : 全局解释器锁 GIL
# 1.这个锁是锁线程的
# 2.这个锁是解释器提供的 # 多线程仍然有它的优势
# 你的程序中用到cpu真的多么
# 如果100% 90%的时间都消耗在计算上,那么cpython解释器下的多线程对你来说确实没用
# 但是你写的大部分程序 的时间实际上都消耗在了IO操作上
# 遇到高计算型
# 开进程 4个进程 每个进程里开n个线程
# 换个解释器

threading模块

import os
import time
from threading import Thread
# Process 进程类
# Thread 线程类
# 1.初识线程模块
def func():
print('start',os.getpid())
time.sleep(1)
print('end') if __name__ == '__main__':
t = Thread(target=func)
t.start()
for i in range(5):
print('主线程',os.getpid())
time.sleep(0.3)
import time
from threading import Thread
def func():
n = 1 + 2 + 3
n ** 2 if __name__ == '__main__':
start = time.time()
lst = []
for i in range(100):
t = Thread(target=func)
t.start()
lst.append(t)
for t in lst:
t.join()
print(time.time() - start)#0.026000261306762695 # import time
# from multiprocessing import Process as Thread
# def func():
# n = 1 + 2 + 3
# n**2
#
# if __name__ == '__main__':
# start = time.time()
# lst = []
# for i in range(100):
# t = Thread(target=func)
# t.start()
# lst.append(t)
# for t in lst:
# t.join()
# print(time.time() - start)#15.187999963760376
# 3.线程的数据共享
from threading import Thread
n = 100
def func():
global n
n -= 1 t = Thread(target=func)
t.start()
t.join()
print(n)
# 4.开启线程的另一种方式
from threading import Thread
class Mythread(Thread):
def __init__(self,arg):
super().__init__()
self.arg = arg
def run(self):
print('in son',self.arg) t = Mythread(123)
t.start()
# 5.threading模块中的其他功能
import time
from threading import Thread,currentThread,activeCount,enumerate
class Mythread(Thread):
def __init__(self,arg):
super().__init__()
self.arg = arg
def run(self):
time.sleep(1)
print('in son',self.arg,currentThread())
for i in range(10):
t = Mythread(123)
t.start()
print(t.ident)
print(activeCount())
print(enumerate())

守护线程

import time
from threading import Thread def func():
while True:
print('in func')
time.sleep(0.5) def func2():
print('start func2')
time.sleep(10)
print('end func2') Thread(target=func2).start()
t = Thread(target=func)
t.setDaemon(True)
t.start()
print('主线程')
time.sleep(2)
print('主线程结束')
守护进程 只守护主进程的代码,主进程代码结束了就结束守护,守护进程在主进程之前结束 
守护线程 随着主线程的结束才结束,守护线程是怎么结束的
进程 terminate 强制结束一个进程的
线程 没有强制结束的方法
线程结束 : 线程内部的代码执行完毕 那么就自动结束了
多线程实现socket_server
server
import socket
from threading import Thread
def talk(conn):
while True:
msg = conn.recv(1024).decode()
conn.send(msg.upper().encode()) sk = socket.socket()
sk.bind(('127.0.0.1',9000))
sk.listen()
while True:
conn,addr = sk.accept()
Thread(target=talk,args = (conn,)).start()

import socket
sk = socket.socket() sk.connect(('127.0.0.1',9000))
while True:
sk.send(b'hello')
print(sk.recv(1024))


												

day41 Pyhton 并发编程04的更多相关文章

  1. 并发编程 04——闭锁CountDownLatch 与 栅栏CyclicBarrier

    Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...

  2. Python并发编程04 /多线程、生产消费者模型、线程进程对比、线程的方法、线程join、守护线程、线程互斥锁

    Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线程join.守护线程.线程互斥锁 目录 Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线 ...

  3. day38 Pyhton 并发编程

    # 网络编程 # arp协议 : # 1.这是一个通过ip找mac地址的协议 # 2.由于有了socket,用户在使用网络的时候,只需要关心对方用户的ip地址就可以了 # 3.如果用户即将和这个ip进 ...

  4. Java并发编程(04):线程间通信,等待/通知机制

    本文源码:GitHub·点这里 || GitEE·点这里 一.概念简介 1.线程通信 在操作系统中,线程是个独立的个体,但是在线程执行过程中,如果处理同一个业务逻辑,可能会产生资源争抢,导致并发问题, ...

  5. day43 Pyhton 并发编程06

    一.内容回顾 线程 锁 为什么有了GIL之后还需要锁 多个线程同时操作全局变量还需要锁 当出现'非原子性操作',例如+= -= *= /= l.append(l) 原子性操作 a += 1  a= a ...

  6. day42 Pyhton 并发编程05

    一.内容回顾 # 线程 # 正常的编程界: # 进程 # 计算机中最小的资源分配单位 # 数据隔离 # 进程可以独立存在 # 创建与销毁 还有切换 都慢 给操作系统压力大 # 线程 # 计算机中能被C ...

  7. day40 Pyhton 并发编程03

    一.内容回顾 进程是计算机中最小的资源分配单位 进程与进程之间数据隔离,执行过程异步 为什么会出现进程的概念? 为了合理利用cpu,提高用户体验 多个进程是可以同时利用多个cpu的,可以实现并行的效果 ...

  8. day39 Pyhton 并发编程02 后

    一.开启子进程的另一种方式 import os from multiprocessing import Process class MyProcess(Process): def __init__(s ...

  9. day39 Pyhton 并发编程02

    一.内容回顾 并发和并行的区别 并发 宏观上是在同时运行的 微观上是一个一个顺序执行 同一时刻只有一个cpu在工作 并行 微观上就是同时执行的 同一时刻不止有一个cpu在工作 什么是进程 一个运行中的 ...

随机推荐

  1. centos7安装jdk11

    我下载的网址是http://jdk.java.net/11/ 找安装包的事就说到这里了.我是因为公司用的jdk8,但是,我给个人研究东西的时候,目前定的版本是jdk11 .另外,现在基本全线转到了op ...

  2. javascript事件环微任务和宏任务队列原理

    哈喽!大家好!我是木瓜太香,我又来嘞,今天来说说前端面试中经常别问到的 JS 事件环问题. JS 事件环 JS 程序的运行是离不开事件环机制的,这个机制保证在发生某些事情的时候我们有机会执行一个我们事 ...

  3. Kubernetes-12:Secret介绍及演示

    Secret介绍 Secret存在的意义 Secret解决了密码.token.密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中,可以以Volume或者环境变量的方式使用 ...

  4. odoo提示你没有查看此类文档的权限

    问题: odoo出现提示信息:"抱歉, 你没有访问此类型文档的权限 '未知' (_unknown). 没有为此操作指定权限组 - (操作: read, 用户: 2)" 出错原因: ...

  5. 漏洞扫描工具acunetix破解安装步骤

    Acunetix 12破解版安装教程 下载地址: 链接:https://pan.baidu.com/s/1jsKkrhOcx_O7ib7FQ6pidw 提取码:pwdj 1.下载软件压缩包文件,首先点 ...

  6. 初识ABP vNext(10):ABP设置管理

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 定义设置 使用设置 最后 前言 上一篇介绍了ABP模块化开发的基本步骤,完成了一个简单的文件上传功能.通常的模块都有一 ...

  7. java8的interface的方法定义

    转自https://www.cnblogs.com/zhenghengbin/p/9398682.html Java8新特性(一)_interface中的static方法和default方法   为什 ...

  8. kafka学习(三)kafka生产者,消费者详解

    文章更新时间:2020/06/14 一.生产者 当我们发送消息之前,先问几个问题:每条消息都是很关键且不能容忍丢失么?偶尔重复消息可以么?我们关注的是消息延迟还是写入消息的吞吐量? 举个例子,有一个信 ...

  9. dedecmsv5.7sp1远程文件包含漏洞审计

    dedecms5.7 sp1版本存在远程文件包含漏洞,在此记录审计复现漏洞过程. 漏洞在/install/index.php(index.php.bak)文件中,漏洞起因是$$符号使用不当,导致变量覆 ...

  10. php花式读取文件

    读文件 hightlight_file($filename); show_source($filename); print_r(php_strip_whitespace($filename)); pr ...