随笔分类 - 网络并发
摘要:【一】网络通信实现 【1】实现网络通信的四要素 本机的IP地址 子网掩码 网关的IP地址 DNS的IP地址 【2】获取四要素的两种方式 (1)静态获取 即手动配置 (2)动态获取 通过dhcp获取 以太网头 ip头 udp头 dhcp数据包 (1)最前面的”以太网标头”,设置发出方(本机)的MAC地
阅读全文
摘要:服务端: from multiprocessing import Process from socket import * def talk(conn): while True: try: data = conn.recv(1024) if not data: break conn.send(dat
阅读全文
摘要:服务端: from socket import * from threading import Thread def communicate(conn): while True: try: data = conn.recv(1024) if not data: break conn.send(dat
阅读全文
摘要:引言 Python的I/O模型分为同步(sync)和异步(async)两种: 同步I/O模型是指,当一个线程在等待I/O操作完成时,它不能执行其他任务,需要一直等待I/O操作完成,直到接收到I/O操作的完成通知后才继续执行。 异步I/O模型是指,当一个线程发起一个I/O操作后,不会等待I/O操作完成
阅读全文
摘要:引言 Python 中的协程: 协程是一种轻量级的用户级线程,它在单线程内执行,不会阻塞主线程,可以在多个任务间轻松地切换,因此可以用于实现异步I/O操作。协程的实现方式与生成器非常相似,通过使用yield语句来暂停和恢复执行。 协程可以与asyncio库配合使用,来实现异步I/O操作。这种方式可以
阅读全文
摘要:Gevent的介绍 greenlet已经实现了协程,但是这个还要人工切换,这里介绍一个比greenlet更强大而且能够自动切换任务的第三方库,那就是gevent。 gevent内部封装的greenlet,其原理是当一个greenlet遇到IO操作时,,比如访问网络,就自动切换到其他的greenlet
阅读全文
摘要:Greenlet模块 如果我们在单个线程内有20个任务,要想实现在多个任务之间切换,使用yield生成器的方式过于麻烦(需要先得到初始化一次的生成器,然后再调用send。。。非常麻烦),而使用greenlet模块可以非常简单地实现这20个任务直接的切换。 安装: pip install greenl
阅读全文
摘要:引言 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态。 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过
阅读全文
摘要:引言 首先,需要注意一下:不能无限的开进程,不能无限的开线程,最常用的就是开进程池,开线程池。 其中,回调函数非常重要,回调函数其实可以作为一种编程思想,谁好了谁就去掉只要你用并发,就会有锁的问题,但是你不能一直去自己加锁吧。 那么我们就用QUEUE,这样还解决了自动加锁的问题,但是由Queue延伸
阅读全文
摘要:队列queue介绍 queue用于建立和操作队列,常和threading类一起用来建立一个简单的线程队列。 首先,队列有很多种,根据进出顺序来分类,可以分成 queue.Queue(maxsize) FIFO(先进先出队列) queue.LifoQueue(maxsize) LIFO(先进后出队列)
阅读全文
摘要:定时器 定时器,指定n秒后执行某操作 简易版: from threading import Timer def task(name): print('hello %s' % name) t = Timer(5, task, args=('xiao',)) t.start() # hello xiao
阅读全文
摘要:条件Condition(了解) 使得线程等待,只有满足某条件时,才释放n个线程 import threading def run(n): con.acquire() con.wait() print("run the thread: %s" % n) con.release() if __name_
阅读全文
摘要:Event事件 事件处理的方法: event.is_set():返回event的状态值; event.wait():如果 event.isSet()==False将阻塞线程; event.set(): 设置event的状态值为True,所有阻塞池的线程激活进入就绪状态, 等待操作系统调度; even
阅读全文
摘要:信号量Semaphore Semaphore管理一个内置的计数器, 每当调用acquire()时内置计数器-1; 调用release() 时内置计数器+1; 计数器不能小于0;当计数器为0时,acquire()将阻塞线程直到其他线程调用release()。 代码示例: import random i
阅读全文
摘要:死锁 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,如下就是死锁 代码解释: import time from threading imp
阅读全文
摘要:引言 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。有名的编译器例如GCC,INTEL C++,Visual C++等。Python也一样,同样一段代
阅读全文
摘要:工作原理是将并行变成局部串行,牺牲了效率,保证了数据的安全。 未加锁: import time from threading import Thread n = 100 def task(): global n # mutex.acquire() temp = n time.sleep(0.1) n
阅读全文
摘要:无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁 需要强调的是:运行完毕并非终止运行 #1.对主进程来说,运行完毕指的是主进程代码运行完毕 #2.对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕 #1 主进程在其代码结束后就已经算运行完
阅读全文
摘要:多线程简单介绍 多线程,或者说多任务,指的是操作系统同时运行多个任务。例如,听歌、洗衣服、看视频可以同时进行,这种就是多任务。 单核CPU执行多任务:操作系统轮流让各个任务交替执行,任务1执行t1时间,切换到任务2,任务2执行t2时间,再切换到任务3,执行t3时间...如此反复执行,表面上看,每个任
阅读全文
摘要:什么叫线程 线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。 线程自己不用有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个一个进程的其他线程共享其所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发
阅读全文