首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

18 Python 基础: 重点知识点--进程和线程讲解

同时执行多个任务通常各个任务之间并不是没有关联的,而是需要相互通信和协调,有时,任务1必须暂停等待任务2完成后才能继续执行,有时,任务3和任务4又不能同时执行,所以,多进程和多线程的程序的复杂度要远远高于我们前面写的单进程单线程的程序...p.start()调用实例化对象的start() 如果需要主进程等待子进程运行完毕,主进程才继续运行,那么需要调用p.join()方法 [image.png] [image.png] 创建子进程时,只需要传入一个执行函数函数的参数...请注意输出的结果,task 0,1,2,3是立刻执行的,task 4要等待前面某个task完成后才执行,这是因为Pool的默认大小在我的电脑上是4,因此,最多同时执行4个进程。...总结,两个需记住的知识点: 1.如何实例化一个线程(Thread类对象) 2.如何解决数据共享导致数据混乱的问题(Lock) 多核CPU 如果你不幸拥有一个多核CPU,你肯定在想,多核应该可以同时执行多个线程...但是局部变量也有问题,就是在函数调用的时候,传递起来很麻烦: 多线程---》全局数据可以共享 多线程数据共享---》让这些线程执行的函数里面的变量都是局部变量---》如果函数需要外部的变量和值,那么就需要通过参数进行传递

69620

dotnet 谨慎在静态构造函数里使用锁

如以下代码 var foo = new Foo(); 如果有多个线程同时进入,调用到 new Foo() 这句代码,自然是创建出多个不同的实例。...如上文所说,一个类型的静态构造函数将在类型第一次被碰到时被 CLR 调用,那如何了解当前是第一次碰到?...在静态构造函数多个线程碰到时,相当于进入了资源竞争,无论是多少个线程同时碰到某个类型,此类型的静态构造函数只能由其中的一个线程执行,而其他线程进入等待过程。...相当于进入静态构造函数时设置了一个锁对象,只有一个线程能进入调用静态构造函数,其他线程只能等待静态构造函数执行完成才能继续 多线程在碰到某个类型的静态构造函数时,就和碰到竞态资源一样,也相当于碰到一个锁...但是获取 Foo1 的 Number 属性需要等待在 task2 上执行的 Foo1 的静态构造函数执行完成 也就是说在 task1 上执行的代码,需要等待 task2 执行完成,才能释放锁。

58210
您找到你想要的搜索结果了吗?
是的
没有找到

搞懂IO多路复用及其技术

同步是指用户线程发起IO请求后需要等待或者轮询内核IO操作,完成后才能继续执行。异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后回通知用户线程,或者调用用户线程注册的回调函数。...阻塞和非阻塞的概念描述的是用户线程调用内核IO操作的方式,阻塞时指IO操作需要彻底完成后才能返回用户空间,非阻塞时指IO操作被调用后立即返回给用户一个状态值,无需等待IO操作彻底完成。...select/poll/epoll核心是可以同时处理多个connection,不是更快,所以连接数不高的话,性能不一定比多线程+阻塞IO好。...select是内核提供的多路分离函数,使用它可以避免同步非阻塞IO中轮询等待问题。 ? 用户首先将需要进行IO操作的socket添加到select中,然后阻塞等待select系统调用返回。...用户线程注册事件处理器之后可以继续执行做其他的工作(异步),Reactor线程负责调用内核的select函数检查socket状态。

50420

线程(二)线程互斥+线程同步

但有时候,很多变量都需要在线程间共享,这样的变量称为共享变量,可以通过数据的共享,完成线程之间的交互。 多个线程并发的操作共享变量,会带来一些问题。...如果多个线程同时要求执行临界区的代码,并且临界区没有线程在执行,那么只能允许一个线程进入该临界区。 如果线程不在临界区中执行,那么该线程不能阻止其他线程进入临界区。...pthread_ lock 时,可能会遇到以下情况: 互斥量处于未锁状态,该函数会将互斥量锁定,同时返回成功 发起函数调用时,其他线程已经锁定互斥量,或者存在其他线程同时申请互斥量,但没有竞争到互斥量...,没有写入的权限,一般来说这些线程是安全的 类或者接口对于线程来说都是原子操作 多个线程之间的切换不会导致该接口的执行结果存在二义性 常见不可重入的情况 调用了malloc/free函数,因为malloc...或者new开辟出的空间 不调用不可重入函数 返回静态或全局数据,所有数据都有函数调用者提供 使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据 可重入与线程安全联系 函数是可重入的,那就是线程安全的

1.2K10

进程和线程(上)

因为文章比较长,所以会分为两篇进行介绍 概念 并发编程就是实现让程序同时执行多个任务,如何实现并发编程呢,这里就涉及到进程和线程这两个概念。...当要实现并发编程,也就是同时执行多任务时,有以下三种解决方案: 多进程,每个进程只有一个线程,但多个进程一起执行多个任务; 多线程,只启动一个进程,但一个进程内开启多个线程; 多进程+多线程,即启动多个进程...多进程 在 Unix/Linux 系统中,提供了一个 fork() 系统调用,它是一个特殊的函数,普通函数调用调用一次,返回一次,但 fork 函数调用一次,返回两次,因为调用函数的是父进程,然后复制出一份子进程了...子进程返回的永远是 0 ,父进程会返回子进程的 ID,因为父进程可以复制多个子进程,所以需要记录每个子进程的 ID,子进程可以通过调用 getpid() 获取父进程的 ID。...,args 是一个元组,表示传递给函数的参数,然后采用 start 来启动进程, join 方法表示等待进程执行结束。

72310

进程和线程(上)

因为文章比较长,所以会分为两篇进行介绍 概念 并发编程就是实现让程序同时执行多个任务,如何实现并发编程呢,这里就涉及到进程和线程这两个概念。...当要实现并发编程,也就是同时执行多任务时,有以下三种解决方案: 多进程,每个进程只有一个线程,但多个进程一起执行多个任务; 多线程,只启动一个进程,但一个进程内开启多个线程; 多进程+多线程,即启动多个进程...多进程 在 Unix/Linux 系统中,提供了一个 fork() 系统调用,它是一个特殊的函数,普通函数调用调用一次,返回一次,但 fork 函数调用一次,返回两次,因为调用函数的是父进程,然后复制出一份子进程了...子进程返回的永远是 0 ,父进程会返回子进程的 ID,因为父进程可以复制多个子进程,所以需要记录每个子进程的 ID,子进程可以通过调用 getpid() 获取父进程的 ID。...,args 是一个元组,表示传递给函数的参数,然后采用 start 来启动进程, join 方法表示等待进程执行结束。

60910

python 线程创建和传参

可以这么理解:一个线程执行一个代码块,多个线程可以同时执行多个代码,使用多线程能让程序效率更高。...举个例子,你今天有两件事需要完成,分别是洗衣服和打扫房间,分别来看看单线程和多线程如何完成: 单线程:先用洗衣机洗衣服30分钟,等衣服洗完之后再打扫房间60分钟,累计总耗时:90分钟; 多线程:把衣服放到洗衣机并且...30分钟后自动结束,然后立刻开始打扫房间60分钟,累计耗时:60分钟; 由此可见,完成同样的事情,单线程是一件事情做完之后继续下一件事情,多线程可以同时执行多件事情,所以多线程比单线程效率更高!...第二步:程序停止5秒; 第三步:洗衣服和打扫房间几乎同时完成 当然你也可以按照以前的学习的内容,先调用wash_clothes函数,在调用clean_room函数,同样能输出内容,耗时却是10秒左右,...注意观察输出日志: 第一步:洗衣服开始; 第二步:程序停止了5秒; 第三步:洗衣服完成,打扫房间开始 第四步:程序停止5秒; 第五步:打扫房间结束,程序结束; 由此可见:多线程可以同时运行多个任务,效率远比单线程更高

2.1K30

C++线程知识点汇总

主线程继续执行其他任务,然后调用 t.join() 来等待子线程执行完成。最终输出结果会在子线程和主线程执行完成后一起打印。...下面是一个示例代码,演示了如何使用 std::lock 函数同时多个互斥锁进行加锁: #include #include #include std...在多线程环境下,多个线程同时调用 std::call_once,但只有一个线程会执行 func 函数,其他线程会被阻塞直到第一个线程执行完成。...即使多个线程同时调用 use_global_data 函数,但只有一个线程会执行 init_global_data 函数,其他线程会被阻塞,直到第一个线程执行完成。...等待和通知:等待线程可以通过 wait() 函数在条件不满足时进入等待状态,唤醒线程可以通过 notify_one() 或 notify_all() 函数来唤醒等待的线程。

12010

实现数据库连接池-后传

多个线程同时调用 getInstance() 方法时,只有一个线程能够获得锁并进入临界区,其他线程将被阻塞。...在早期版本的 C++ 中,双重检查锁定可能会由于编译器优化失效 有人不理解什么是临界区,以及为什么要检查两遍instance,原因是这样的 临界区是指在多线程环境中,多个线程可能同时访问同一段代码或数据的区域...5.多线程 既然都讲到这里了,再简单说下C++的多线程 多线程是指在一个程序中同时运行多个线程来完成不同的任务。...7.atomic_int atomic_int 是一个原子类型,它可以在多线程环境中安全地进行读写操作,不会出现数据竞争 可以把 atomic_int 想象成一个保险箱,多个人可以同时往里面存钱或取钱...由于每个线程都只访问自己的局部变量,访问共享数据,所以这个例子中的线程是安全的,即使它们并行执行也不会出现问题。

7510

28.python 线程创建和传参

可以这么理解:一个线程执行一个代码块,多个线程可以同时执行多个代码,使用多线程能让程序效率更高。...举个例子,你今天有两件事需要完成,分别是洗衣服和打扫房间,分别来看看单线程和多线程如何完成: 单线程:先用洗衣机洗衣服30分钟,等衣服洗完之后再打扫房间60分钟,累计总耗时:90分钟; 多线程:把衣服放到洗衣机并且...30分钟后自动结束,然后立刻开始打扫房间60分钟,累计耗时:60分钟; 由此可见,完成同样的事情,单线程是一件事情做完之后继续下一件事情,多线程可以同时执行多件事情,所以多线程比单线程效率更高!...第二步:程序停止5秒; 第三步:洗衣服和打扫房间几乎同时完成 当然你也可以按照以前的学习的内容,先调用wash_clothes函数,在调用clean_room函数,同样能输出内容,耗时却是10秒左右,...注意观察输出日志: 第一步:洗衣服开始; 第二步:程序停止了5秒; 第三步:洗衣服完成,打扫房间开始 第四步:程序停止5秒; 第五步:打扫房间结束,程序结束; 由此可见:多线程可以同时运行多个任务,效率远比单线程更高

50220

Python的线程

多线程类似于同时执行多个不同程序,多线程运行有如下优点: 可以把运行时间长的任务放到后台去处理。...,互不影响,多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改,因此,线程之间共享数据最大的危险在于多个线程同时改一个变量,把内容给改乱了。...创建一个锁就是通过threading.Lock()来实现: 修改后的代码: 当多个线程同时执行lock.acquire()时,只有一个线程能成功地获取锁,然后继续执行代码,其他线程就继续等待直到获得锁为止...由于全局器锁的存在,在进行多线程操作的时候,不能调用多个CPU内核,只能利用一个内核,所以在进行CPU密集型操作的时候,推荐使用多线程,更加倾向于多进程,那么多线程适合什么样的应用场景呢?...但是局部变量也有问题,就是在函数调用的时候,传递起来很麻烦: 每个函数一层一层调用都这么传参数那还得了?用全局变量?也不行,因为每个线程处理不同的Student对象,不能共享。

72080

C++ 高性能服务器网络框架设计细节

这篇文章我们将介绍服务器的开发,并从多个方面探究如何开发一款高性能高并发的服务器程序。需要注意的是一般大型服务器,其复杂程度在于其业务,不是在于其代码工程的基本框架。...有鉴于此,这篇文章讨论那些大空、泛泛谈的技术术语,而是讲的是实实在在的能指导读者在实际工作中实践的编码方案或优化已有编码的方法。...例如,connect 函数连接另外一端,如果用于连接 socket 是非阻塞的,那么 connect 虽然不能立刻连接完成,但是也是会立刻返回,无需等待,等连接完成之后,WSAAsyncSelect 会返回...(三)检测网络事件的正确姿势   根据上面的介绍,第一,为了避免无意义的等待时间,第二,采用主动查询各个 socket 的事件,而是采用等待操作系统通知我们有事件的状态的策略。...同理,我们也应该在 socket 上有可读事件的时候才去收取数据,这样我们调用 recv 或者 read 函数时不用等待,至于一次性收多少数据好呢?

1.6K62

Linux并发与同步

函数调用的时候,该函数获得控制权,成为激活(active)函数,然后运行该函数中的指令。与此同时,其它的函数处于离场状态,并不运行。如下图所示: ?...多线程就是允许一个进程内存在多个控制权,以便让多个函数同时处于激活状态,从而让多个函数的操作同时运行。即使是单CPU的计算机,也可以通过不停地在不同线程的指令间切换,从而造成多线程同时运行的效果。...如果该工人是前十个完成的人,那么我们就调用cond_wait()函数。 cond_wait()做两件事情,一个是释放mu,从而让别的工人可以建房。另一个是等待,直到cond的通知。...这个函数会给所有调用cond_wait()的线程放送通知,以便让那些线程恢复运行。 条件变量特别适用于多个线程等待某个条件的发生。...如果一个锁被一个线程获得W锁,那么其它线程,无论是想要获取R锁还是W锁,都必须等待该线程释放W锁。 这样,多个线程就可以同时读取共享资源。具有危险性的写入操作则得到了互斥锁的保护。

2K90

两种IO模式:Proactor与Reactor模式

阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值...因为此时是通过select系统调用完成的,select函数本身的实现方式是阻塞的,采用select函数有个好处就是它可以同时监听多个文件句柄(如果从UNP的角度看,select属于同步操作。...综上所述,同步和异步是相对于应用和内核的交互方式而言的,同步 需要主动去询问,而异步的时候内核在IO事件发生的时候通知应用程序,阻塞和非阻塞仅仅是系统在调用系统调用的时候函数的实现方式而已。...区别在于等不等待数据就绪. 因为数据占了等待的80%时间. 同步非阻塞的优势就是一个进程里同时处理多个I/O操作。...如果服务器想要同时接收多个TCP连接的数据,就必须轮流对每个socket调用接收数据的方法,比如recv()。

77810

QThread介绍

,在run函数里来实现线程需要完成的任务。...如果先前有其他线程以写锁方式进行了锁定,则调用这个函数会阻塞等待 lockForWrite():以写入方式锁定资源,其他线程不可读,不可写。...,不允许多个线程在读的同时写,不允许在写的同时读或写。...利用信号量(QSemaphore)实现的线程同步: 互斥锁、共享锁都只能针对一个资源进行保护,不能针对多个类似的资源进行保护。利用QSemaphore可以做到对多个类似的资源进行保护。...此例如果用互斥锁或读写锁实现的话效率将大打折扣(生产者:上锁(等待)—-写满缓冲区—–解锁 消费者:上锁(等待)—–读缓冲区—–解锁),针对一个有多个字节的数据缓冲区读写不能同时进行。

1K20

socket阻塞与非阻塞,同步与异步、IO模型

例如,我们在socket中调用recv函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。此时,当前线程还会继续处理各种各样的消息。...当线程遇到I/O 操作时,不会以阻塞的方式等待I/O 操作的完成或数据的返回,只是将I/O 请求发送给操作系统,继续执行下一条语句。...多线程/进程服务器同时多个客户机提供应答服务。模型如下: 主线程持续等待客户端的连接请求,如果有连接,则创建新线程,并在新线程中提供为前例同样的问答服务。...epoll函数,这几个函数也会使进程阻塞,但是和阻塞I/O所不同的的,这两个函数可以同时阻塞多个I/O操作。...而且可以同时多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数

1.7K30

Linux kernel 同步机制(下篇)

读写信号量可同时拥有不受限的读者数,写者是排他性的,独占性的,读者排他。...写者是排他性的,一个读写锁同时只能有一个写者或多个读者(与CPU数相关),但不能同时既有读者又有写者。 在读写锁保持期间也是抢占失效的。...四、RCU(Read-Copy Update) RCU是读写锁的高性能版本,既允许多个读者同时访问被保护的数据,又允许多个读者和多个写者同时访问被保护的数据(注意:是否可以有多个写者并行访问取决于写者之间使用的同步机制...有一个专门的垃圾收集器探测读者的信号,一旦所有读者都已发送信号告知它们不在使用被RCU保护的数据结构,垃圾收集器就调用回调函数完成最后的数据释放或修改操作。...该函数通过注册一个func为wakeme_after_rcu的rcu_head并等待该rcu_head完成回调来判断之前的rcu读者已经全部退出。

2.1K30

【C++11】std::async函数介绍及问题梳理

这个函数的作用是根据给定的执行策略异步执行函数 f,并返回一个 std::future 对象,可用来等待函数的执行完成并获取函数的结果。...问题梳理 2.1 std::async(异步执行) 到 future get 直接调用如何抛异常 std::async 到 std::future::get 直接调用会抛出异常,主要有两种情况: 函数对象抛出异常...因此,即使在主线程中抛出了异常,新线程中的任务函数也会继续执行:std::future::get 会等待 task2 函数执行完成【含加入的延时:100毫秒】,然后抛出 std::future_error...在使用 std::async 时,如果系统线程不够,可能会导致无法启动新线程引发异常【这通常不是由于内存不足引起的,而是由于达到了系统对同时运行线程数量的限制】 【示例】系统线程不够抛异常 #include...然后调用 future.get() 等待异步任务完成,并获取其结果。如果异步任务中抛出了异常,future.get() 函数会在主线程中抛出相同的异常。

26810

计算机的运行原理

当f函数执行的时候,f函数就在栈顶,栈帧中存储f函数的局部变量,输入参数等,当f函数调用g函数,当前执行函数就变成了g函数,操作系统会为g函数创建一个栈帧并且放置在栈顶,当函数g()调用结束,程序返回f...函数,g函数对应的栈帧出栈,顶部的栈帧变成了f函数,继续执行f函数的代码,也就是说,真正的执行的函数永远都在栈顶,并且因为栈帧是隔离的,所以不同函数可以定义相同的变量不会发生混乱 一台计算机如何同时处理数以百计的任务...阻塞:等待 或者睡眠状态,当一个进程正在等待某一个事件的发生(例如等待IO完成等待锁)暂时停止运行,这个时候即使CPU分配给进程也无法运行,故称为该进程处于阻塞状态。...以Java的Web开发为例,似乎我们编程的时候通常并不需要自己创建和启动线程,那么我们的程序时如何被多线程并发执行的,同时处理多个用户的请求的呢,实际中,启动多线程,为每个用户请求分配一个处理线程的工作是在...Tomcat启动多个线程,为每个用户请求分配一个线程,调用和请求URL路径相应的Servle(或者Controller)代码,完成用户请求处理。

68741

程序员的23大IO&NIO面试问题及答案

6.阻塞IO (blocking IO) 应用程序调用一个IO函数,导致应用程序阻塞,如果数据已经准备好,从内核拷贝到用户空间,否则一直等待下去。...IO,基本原理就是select,poll,epoll这些个函数会不断轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程,这三个functon会阻塞进程,但和IO阻塞不同,这些函数可以同时阻塞多个...IO操作,而且可以同时多个读操作,写操作IO进行检验,直到有数据到达,才真正调用IO操作函数调用过程如下图;所以IO多路复用的特点是通过一种机制一个进程能同时等待多个文件描述符,而这些文件描述符(套接字描述符...我们随后既可以在信号处理函数调用recvfrom读取数据报,并通知主循环数据已经准备好待处理。特点:等待数据报到达期间进程不被阻塞。...我们的进程阻塞于等待I/0操作的完成。当内核将数据拷贝到缓冲区后,再通知应用程序。 用户进程发起read操作之后,立刻就可以开始去做其它的事。

27420
领券