python 多进程、多线程、多协程应用场景实例详解

合集下载

python excel多线程实例

python excel多线程实例

python excel多线程实例如何使用Python的多线程处理Excel表格数据在现代数据处理的时代,Excel表格是最常见的数据存储和分析工具之一。

而Python作为一门强大而灵活的编程语言,可以用于处理各种类型的数据。

本文将介绍如何使用Python的多线程功能来处理Excel表格数据,以提高数据处理的效率和速度。

第一步:导入所需的库在使用Python进行Excel表格数据处理之前,我们需要导入所需的库。

在本例中,我们将使用openpyxl来读取和写入Excel文件,同时我们还将使用concurrent.futures来实现多线程功能。

因此,需要在代码中添加以下导入语句:import openpyxlimport concurrent.futures第二步:读取Excel表格数据在我们开始处理数据之前,首先需要读取Excel表格中的数据。

这里假设Excel表格的文件名为“data.xlsx”,其中包含一个名为“Sheet1”的工作表。

我们可以使用openpyxl库的load_workbook函数来读取工作表,然后使用工作表对象的iter_rows方法迭代行对象,并将每一行的数据保存到一个列表中。

下面是读取Excel数据并保存到列表的代码示例:def read_excel():workbook = openpyxl.load_workbook('data.xlsx')sheet = workbook['Sheet1']data = []for row in sheet.iter_rows(values_only=True):data.append(row)return data第三步:将数据分批处理一旦我们已经成功读取了Excel表格中的数据,接下来就可以将数据分批处理。

这样可以使得每个线程都负责处理一部分数据,以加快处理速度。

我们可以将数据列表按照一定的大小分成多个子列表,然后将每个子列表传递给一个线程处理。

Python并发:多线程与多进程的详解

Python并发:多线程与多进程的详解

Python并发:多线程与多进程的详解本篇概要1.线程与多线程2.进程与多进程3.多线程并发下载图⽚4.多进程并发提⾼数字运算关于并发在计算机编程领域,并发编程是⼀个很常见的名词和功能了,其实并发这个理念,最初是源于铁路和电报的早期⼯作。

⽐如在同⼀个铁路系统上如何安排多列⽕车,保证每列⽕车的运⾏都不会发⽣冲突。

后来在20世纪60年代,学术界对计算机的并⾏计算开始进⾏研究,再后来,操作系统能够进⾏并发的处理任务,编程语⾔能够为程序实现并发的功能。

线程与多线程什么是线程⼀个线程可以看成是⼀个有序的指令流(完成特定任务的指令),并且可以通过操作系统来调度这些指令流。

线程通常位于进程程⾥⾯,由⼀个程序计数器、⼀个堆栈和⼀组寄存器以及⼀个标识符组成。

这些线程是处理器可以分配时间的最⼩执⾏单元。

线程之间是可以共享内存并且互相通信的。

但是当两个线程之间开始共享内存,就⽆法保证线程执⾏的顺序,这可能导致程序错误,或者产⽣错误的结果。

这个问题我们⽇后会专门提及。

下⾯这个图⽚展⽰了多个线程在多个CPU中的存在⽅式:线程的类型在⼀个典型的操作系统⾥⾯,⼀般会有两种类型的线程:1.⽤户级线程:我们能够创建、运⾏和杀死的线程;2.内核级线程:操作系统运⾏的低级别线程;Python⼯作在⽤户级线程上,我们介绍的内容也主要是在⽤户级的线程上运⾏的。

什么是多线程现在的CPU基本上都是多线程的CPU,⽐如我们随意从京东上找⼀个Inter的酷睿i5处理器,看看它的产品规格:这些CPU能够同时运⾏多个线程来处理任务,其实从本质上来说,这些CPU是利⽤⼀个能够在多个线程之间快速切换的单个内核来完成多线程的运⾏的,切换线程的速度⾜够快,所以我们并不会感觉到。

但实质上,它们并不是同时运⾏的。

为了形象的理解多线程,我们来回忆⼀个场景。

在⼤学时代,期末的时候,有些科⽬的⽼师为了不为难⼤家,把考试设为开卷考试,不知道⼤家⾯对开卷考试的时候,做题的顺序是怎样的?在单线程的⼯作模式下,我们从选择题到填空题到简答题再到分析题,⼀个⼀个按顺序的写。

python多线程案例

python多线程案例

python多线程案例 Python多线程案例

在计算机编程中,多线程是一种常见的技术,它可以让程序同时执行多个任务,提高程序的效率。Python作为一种高级编程语言,也支持多线程编程。本文将介绍几个Python多线程的案例,以帮助读者更好地理解多线程编程。

1. 线程的创建和启动 在Python中,可以通过继承Thread类或者直接调用Thread函数来创建线程。下面是一个简单的例子:

```python import threading

class MyThread(threading.Thread): def __init__(self, name): threading.Thread.__init__(self) self.name = name

def run(self): print("Thread %s is running" % self.name)

if __name__ == '__main__': t1 = MyThread("Thread1") t2 = MyThread("Thread2") t1.start() t2.start() ```

在这个例子中,我们定义了一个MyThread类,继承了Thread类,并重写了run方法。在主程序中,我们创建了两个线程t1和t2,并分别启动它们。当线程启动后,它们会同时执行run方法中的代码。

2. 线程的同步 在多线程编程中,线程之间的同步是一个重要的问题。Python提供了多种同步机制,如锁、信号量、事件等。下面是一个使用锁的例子:

```python import threading

class Counter: def __init__(self): self.lock = threading.Lock() self.count = 0

def increment(self): self.lock.acquire() self.count += 1 self.lock.release() if __name__ == '__main__': counter = Counter() threads = [] for i in range(10): t = threading.Thread(target=counter.increment) threads.append(t) t.start()

python3多进程、队列、进程池、协程

python3多进程、队列、进程池、协程

python3多进程、队列、进程池、协程多进程1import multiprocessing2import time345def demo1():6while True:7print("demo1")8 time.sleep(1)91011def demo2():12while True:13print("demo2")14 time.sleep(1)151617def main():18 p1 = multiprocessing.Process(target=demo1)19 p2 = multiprocessing.Process(target=demo2)20 p1.start()21 p2.start()222324if__name__ == '__main__':25 main()互斥锁1import threading2import time34 g_num = 0567def demo1(num):8global g_num9# 上锁,如果之前没有被上锁,则上锁成功10# 如果上锁之前,已经被锁上,那么会堵塞在这⾥,直到这个锁被解开为⽌11 mutex.acquire()12for i in range(num):13 g_num += 114# 解锁15 mutex.release()16print("%s" % g_num)171819def demo2(num):20global g_num21 mutex.acquire()22for i in range(num):23 g_num += 124# 解锁25 mutex.release()26print("%s" % g_num)272829# 创建⼀个互斥锁,默认没有上锁30 mutex = threading.Lock()313233def main():34 t1 = threading.Thread(target=demo1, args=(1000000,))35 t2 = threading.Thread(target=demo2, args=(1000000,))3637 t1.start()38 t2.start()3940 time.sleep(3)41print("%s" % g_num)424344if__name__ == '__main__':45 main()队列1import multiprocessing234def download_from_web(q):5# 模拟⽹上下载的数据6 data = [1, 2, 3, 4, 5, 6]7for temp in data:8 q.put(temp)91011def analysis_data(q):12# 数据处理13 waiting = list()14while True:15 data = q.get()16 waiting.append(data)17if q.empty():18break1920print(waiting)212223def main():24# 创建队列25 q = multiprocessing.Queue()26 p1 = multiprocessing.Process(target=download_from_web, args=(q,))27 p2 = multiprocessing.Process(target=analysis_data, args=(q,))2829 p1.start()30 p2.start()313233if__name__ == '__main__':34 main()进程池1from multiprocessing import Pool2import time3import random4import os567def worker(msg):8 t_start = time.time()9print("%s 开始执⾏,进程号是 %d" % (msg, os.getpid()))10 time.sleep(random.random() * 2)11 t_stop = time.time()12print(msg, "执⾏完毕,耗时%.2f秒" % (t_stop - t_start))131415if__name__ == '__main__':16# 定义1个进程池,最⼤进程数为317 po = Pool(3)18for i in range(8):19# 调⽤⽬标,传递给⽬标的参数元组20 po.apply_async(worker, (i,))21print("-- start --")22# 关闭进程池,不再接收新的请求23 po.close()24# 等待po中所有⼦进程执⾏完成,必须放在close语句后⾯25 po.join()26print("-- end --")协程1from gevent import monkey2import gevent3import time45 monkey.patch_all()678def f1(n):9for i in range(n):10print(gevent.getcurrent(), i)11 time.sleep(0.5)121314def f2(n):15for i in range(n):16print(gevent.getcurrent(), i)17 time.sleep(0.5)181920def f3(n):21for i in range(n):22print(gevent.getcurrent(), i)23 time.sleep(0.5)242526if__name__ == '__main__':27 gevent.joinall([28 gevent.spawn(f1, 3),29 gevent.spawn(f2, 3),30 gevent.spawn(f3, 3)31 ])使⽤协程下载图⽚1import gevent2import time3from urllib import request4from gevent import monkey5from numba import jit67 monkey.patch_all()8910 @jit11def cbk(a, b, c):12""" 回调函数13 @a:已经下载的数据块14 @b:数据块的⼤⼩15 @c:远程⽂件的⼤⼩16"""17 per = 100.0 * a * b / c18if per > 100:19 per = 10020print('\r下载已经完成 %.2f%%' % per, end="")212223 imgurl = ["https:///mw600/006XNEY7gy1fwj4w6ttb6j30hs0k4tc9.jpg",24"https:///mw600/0073tLPGgy1fx6pxmpwmuj30qo0zkn2x.jpg"]2526 headers = [27 ("User-agent",28"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36")] 293031 @jit32def downloader(jpg_name, url):33 opener = request.build_opener()34 opener.addheaders = headers35 request.install_opener(opener)36 request.urlretrieve(url, jpg_name, cbk)37 time.sleep(0.1)383940 @jit41def main():42 time1 = time.time()43 gevent.joinall([44 gevent.spawn(downloader, "1.jpg", imgurl[0]),45 gevent.spawn(downloader, "2.jpg", imgurl[1]),46 ])47 time2 = time.time()48print(time2 - time1)495051if__name__ == '__main__':52 main()。

【IT专家】python(2.7)中多线程使用举例

【IT专家】python(2.7)中多线程使用举例

本文由我司收集整编,推荐下载,如有疑问,请与我司联系python(2.7)中多线程使用举例

2017/03/16 0 python(2.7)中多线程使用举例python27中多线程使用举例  下边的代码都不难理解,不做多余解释。唯一有困惑的地方已经在源码中注释说明。这里也不做多线程编码知识的讲解。把这几种形式(主要是第三种)练成muscle memory就行了,整理在这里是为了有时突然生疏方便查找,同时也做知识分享。  一、使用thread模块  import requestsimport threadimport timeheaders = {‘User-Agent’: ‘mySpider-please let me try’,’Version’:’1.0’}def spider(url): r = requests.get(url,headers=headers) print r.status_code,len(r.content),time.ctime().split(‘ ‘)[3]def main(): for i in range(2304,2310,1): url = ‘xxxx/ooxx/page-’+str(i) thread.start_new_thread(spider,(url,)) time.sleep(0.1)if __name__ == ‘__main__’: main()二、使用threading模块  import requestsimport threadingimport timeheaders = {‘User-Agent’:’mySpider-please let me try’,’Version’:’1.1’}def spider(url): r = requests.get(url=url,headers=headers) print r.status_code,len(r.content),time.ctime().split(‘ ‘)[3] time.sleep(0.1)def main(): urls = [] for i in range(2304,2310,1): url = ‘xxxx/ooxx/page-’+str(i) urls.append(url) threads = [] thread_count = len(urls) for i in range(thread_count): t = threading.Thread(target=spider,args=(urls[i],)) threads.append(t) for i in range(thread_count): threads[i].start() for i in range(thread_count): threads[i].join()if __name__ == ‘__main__’: main()三、threading模块+Queue模块  import requestsimport threadingimport timefrom Queue import Queueclass XxxxSpider(threading.Thread): “““docstring for XxxxSpider”““ def __init__(self,queue): threading.Thread.__init__(self) self._queue = queue def run(self): “““ start()让run()在新线程里面运行。直接调用run()就是在当前线程运行了。 start()调用_thread的start_new_thread去运行一个bootstrap方法,在里面做一些准备工作后会调用run() “““ while not self._queue.empty(): page_url = self._queue.get_nowait() print

Python进程、线程、协程详解

Python进程、线程、协程详解

进程与线程的历史我们都知道计算机是由硬件和软件组成的。

硬件中的CPU是计算机的核心,它承担计算机的所有任务。

操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配、任务的调度。

程序是运行在系统上的具有某种功能的软件,比如说浏览器,音乐播放器等。

每次执行程序的时候,都会完成一定的功能,比如说浏览器帮我们打开网页,为了保证其独立性,就需要一个专门的管理和控制执行程序的数据结构——进程控制块。

进程就是一个程序在一个数据集上的一次动态执行过程。

进程一般由程序、数据集、进程控制块三部分组成。

我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。

在早期的操作系统里,计算机只有一个核心,进程执行程序的最小单位,任务调度采用时间片轮转的抢占式方式进行进程调度。

每个进程都有各自的一块独立的内存,保证进程彼此间的内存地址空间的隔离。

随着计算机技术的发展,进程出现了很多弊端,一是进程的创建、撤销和切换的开销比较大,二是由于对称多处理机(对称多处理机(SymmetricalMulti-Processing)又叫SMP,是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构)的出现,可以满足多个运行单位,而多进程并行开销过大。

这个时候就引入了线程的概念。

线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID、程序计数器、寄存器集合和堆栈共同组成。

线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能。

线程没有自己的系统资源,只拥有在运行时必不可少的资源。

但线程可以与同属与同一进程的其他线程共享进程所拥有的其他资源。

进程与线程之间的关系线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。

多线程,多进程使用场景

多线程,多进程使用场景

多线程,多进程使⽤场景
既然有GIL锁,为什么还使⽤多线程?
CPU运⾏程序的时候,从内存中读取数据块,但是内存不⽀持断电保存的功能。

⼀旦断电,数据就会丢失。

所以需要把数据存到物理磁盘中,所以CPU运⾏程序的时候需要先从磁盘中读出来,放到内存中,CPU才能取到数据。

磁盘的读取⽐较慢,CPU在物理磁盘中取数据时,需要等待磁盘准备数据,什么时候数据准备好了,CPU才能使⽤数据,这样造成了资源的浪费,写数据是⼀样的,当CPU往磁盘写⼊数据的时候就会等待,等数据存⼊到磁盘中了CPU才能执⾏别的程序。

造成了CPU空闲阻塞状态,如果有⼤量的IO操作,就会频繁出现阻塞⾏为,那么GIL锁就会⾃动被释放,这样就会保证多线程同时运⾏的效果,虽然不是全部的。

⼀跳主线运⾏的时候,⼤概运⾏了100条指令的时候就会释放GIL锁,或者出现阻塞的时候就会释放GIL锁。

多线程的应⽤场景:
CPU密集型的程序,整个程序运⾏中过程中不需要等待任何的IO操作,只有⼤量的CPU进⾏运算,这种线程不合适,进程实现更加合适,因为每个进程中都有⼀个线程,独享⼀个GIL锁,这样就不涉及抢的问题了,各⾃运⾏各⾃的程序。

所以进程实现更加合适、
协程的使⽤场景:
协程内部是线程内容划分的更⼩的单位,协程跟操作系统没有关系,只是程序员⾃⼰划分出来的,类似于⼀个线程中的⼀跳主线中的两个函数交替运⾏,达到同时运⾏的效果,⽤yield关键字可以让函数暂停下来,next()函数可以让程序继续运⾏,互相配合达到了协程的效果,上下⽂切换快速,不需要竞争资源,⼀条主线。

python 多线程 实例

python 多线程 实例

Python多线程实例在计算机编程中,线程是指程序中的一条执行路径。

多线程是指在一个程序中同时运行多个线程,每个线程都有自己的执行序列。

Python是一种高级编程语言,它支持多线程编程。

通过使用Python的多线程模块,我们可以实现并发执行的程序,提高程序的运行效率。

什么是多线程在传统的单线程编程中,程序按照顺序依次执行每一条指令。

当遇到需要等待的操作时(例如网络请求、文件读写等),程序会暂停执行,直到操作完成才继续执行后面的指令。

而在多线程编程中,程序可以同时执行多个任务。

每个任务称为一个线程,它们可以并发地执行不同的操作。

这样可以充分利用计算机的资源,提高程序的响应速度和处理能力。

Python多线程模块Python提供了内置的threading模块来支持多线程编程。

该模块包含了创建、管理和控制线程的各种方法和类。

创建线程要创建一个新的线程,我们需要定义一个函数作为线程的入口点,并使用threading.Thread类来创建一个新的线程对象。

下面是一个简单示例:import threadingdef print_numbers():for i in range(1, 11):print(i)# 创建一个新的线程对象thread = threading.Thread(target=print_numbers)# 启动线程thread.start()# 等待线程执行完毕thread.join()print("线程执行完毕")在上面的示例中,我们定义了一个名为print_numbers的函数,用于打印1到10的数字。

然后我们使用threading.Thread类创建了一个新的线程对象,并将print_numbers函数作为线程的入口点。

接下来,我们通过调用start方法来启动线程。

一旦启动,线程将开始执行指定的函数。

我们使用join方法等待线程执行完毕。

这样可以确保主线程在子线程完成之前不会终止。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

python 多进程、多线程、多协程应用场景实例详解
(实用版)
目录
1.Python 多进程、多线程、多协程的概念及区别
2.多进程的应用场景实例
3.多线程的应用场景实例
4.多协程的应用场景实例
5.总结
正文
Python 是一款功能强大的编程语言,其中多进程、多线程和多协程是实现并发编程的重要方式。

它们各自有着不同的应用场景和优缺点,下面我们将通过实例来详细了解它们的使用场景。

一、Python 多进程、多线程、多协程的概念及区别
多进程是指在一个程序中同时运行多个进程,每个进程都有自己的独立内存空间和系统资源,它们之间通过进程间通信来交换数据。

多进程适用于 CPU 密集型任务,可以利用多核 CPU 提高程序的执行效率。

多线程是指在一个进程中同时运行多个线程,每个线程共享进程的内存空间和系统资源,它们之间通过共享内存来交换数据。

多线程可以提高程序的执行效率,特别是对于 I/O 密集型任务。

多协程是一种轻量级的并发编程方式,它既不需要切换 CPU,也不需要切换内存,可以在一个线程内部实现多个任务的并发执行。

多协程适用于处理大量 I/O 密集型任务。

二、多进程的应用场景实例
假设我们有一个 CPU 密集型任务,需要对大量数据进行计算,我们
可以使用多进程来实现并发处理。

例如,我们可以将任务分解为多个子任务,每个子任务由一个进程来完成,这样多个进程可以同时运行,大大提高计算效率。

三、多线程的应用场景实例
假设我们有一个I/O密集型任务,需要对大量数据进行读写操作,我们可以使用多线程来实现并发处理。

例如,我们可以使用多个线程同时进行读写操作,这样多个线程可以同时运行,大大提高I/O操作的效率。

四、多协程的应用场景实例
假设我们有一个大量I/O密集型任务,需要对大量数据进行异步读写操作,我们可以使用多协程来实现并发处理。

例如,我们可以使用多个协程同时进行异步读写操作,这样多个协程可以同时在一个线程内部执行,大大提高程序的执行效率。

总结:Python 中的多进程、多线程和多协程都是实现并发编程的重要方式,它们各自有着不同的应用场景和优缺点。

相关文档
最新文档