当前位置:首页 » 编程语言 » 线程池python

线程池python

发布时间: 2022-02-07 22:45:14

‘壹’ 为什么有人说 python 的多线程是鸡肋

因为 Python 中臭名昭着的 GIL。

那么 GIL 是什么?为什么会有 GIL?多线程真的是鸡肋吗? GIL 可以去掉吗?带着这些问题,我们一起往下看,同时需要你有一点点耐心。

多线程是不是鸡肋,我们先做个实验,实验非常简单,就是将数字 “1亿” 递减,减到 0 程序就终止,这个任务如果我们使用单线程来执行,完成时间会是多少?使用多线程又会是多少?show me the code

那么把 GIL 去掉可行吗?

还真有人这么干多,但是结果令人失望,在1999年Greg Stein 和Mark Hammond 两位哥们就创建了一个去掉 GIL 的 Python 分支,在所有可变数据结构上把 GIL 替换为更为细粒度的锁。然而,做过了基准测试之后,去掉GIL的 Python 在单线程条件下执行效率将近慢了2倍。

Python之父表示:基于以上的考虑,去掉GIL没有太大的价值而不必花太多精力。

‘贰’ python 线程池 全局数组 长时间运行 会崩溃吗

我第一次看见python代码里用中文做变量名的,看了下你的代码,修改全局变量前不是应该加上global,也就是你的write方法里。忽略上述问题,长时间运行,是不会崩溃的,它没有引发异常也没有造成内存泄漏。因此可以长时间正常运行,除非人为中断

‘叁’ Python中的线程池是什么

多线程的做法是,可以同时创建多个线程放入等待执行的序列中。某个线程执行完毕就将它从序列中移除并销毁。不然的话,即时创建,然后就一定要等到它销毁,那这不是多线程,这是单线程.
进程中根据需要,为一些需要慢资源、竟争性资源的任务创建线程,排除等候执行。
线程需要等待分配,如果短时间建立了多个线程,哪个线程先开始执行,由调度程序决定;
...调度>>>执行>>>循环
当线程执行完毕,销毁线程。
比如说,下载图片:我有一个列表,记录了要下载的300张图片的URL。每个图片的来源可能是不同网站(服务器)。那么,主循环里只需要创建300个【下载】线程。每个线程负责一个URL的下载任务。
然后,调序程序开始调度:线程1有数据过来了,分配时间片给线程1处理这段数据...线程n执行完毕,销毁线程n...线程1又有数据过来了,分配时间片给线程1处理这段数据......销毁线程n,没有等待中的线程,调度暂停。
于是,所有的图片下载完了。
这个过程与单线程的不同是,在多线程中,最开始同一时间有300个请求在等待若干个服务器返回数据,而单线程则总是只有一个请求在等待服务器返回数据或者正在处理数据,另外299个请求根本不存在。
这才是多线程与单线程最主要的差别:在等待某个资源的时候,把其它资源给别的线程去使用。

‘肆’ python进程,线程,协程以及几种自定义线程池

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

2.线程、进程与协程:
线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员
协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保持状态,下次继续)。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。
协程的适用场景: 当程序中存在大量不需要CPU的操作时(IO),适用于协程;

‘伍’ python线程池设置参数可变吗

(1)可以控制产生线程的数量。通过预先创建一定数量的工作线程并限制其数量,控制线程对象的内存消耗。(2)降低系统开销和资源消耗。通过对多个请求重用线程,线程创建、销毁的开销被分摊到了多个请求上。另外通过限制线程数量,降低虚拟机在垃圾回收方面的开销。(3)提高系统响应速度。线程事先已被创建,请求到达时可直接进行处理,消除了因线程创建所带来的延迟,另外多个线程可并发处理。
 线程池的基本实现方法:
(1)线程池管理器。创建并维护线程池,根据需要调整池的大小,并监控线程泄漏现象。
(2)工作线程。它是一个可以循环执行任务的线程,没有任务时处于 Wait 状态,新任务到达时可被唤醒。
(3)任务队列。它提供一种缓冲机制,用以临时存放待处理的任务,同时作为并发线程的 monitor 对象。
(4)任务接口。它是每个任务必须实现的接口,工作线程通过该接口调度任务的执行。

‘陆’ python 多线程和多进程的区别 mutiprocessing theading

首先你要搞清楚进程和线程的关系:线程是最小的执行单元,而进程由至少一个线程组成。

multiprocessing模块是一个跨平台版本的多进程模块。该模块提供了process类来代表一个进程对象。

Process

构造方法__init__(self, group=None, target=None, name=None, args=(), kwargs={})

参数说明:

group:进程所属组。基本不用

target:表示调用对象或方法名称。

args:表示调用对象的位置参数元组。

name:别名

kwargs:表示调用对象的字典。

示例代码如下:

threading本身就可以创建多个线程:

hreads = []#定义一个线程池

t1 = threading.Thread(target=one,args=(,))#建立一个线程并且赋给t1,这个线程指定调用方法one,并且不带参数

threads.append(t1)#把t1线程装到threads线程池里

t2 = threading.Thread(target=two)

threads.append(t2)

t3 = threading.Thread(target=three)

threads.append(t3)

这时threads这个列表中就有三个线程装在里面了。

下面就是运行这个线程池里面的线程

for t in threads:

用一个for语句遍历threads里的线程,然后调用start()方法运行

注意t.join()必须放在for语句外面。

‘柒’ python 怎么实现多线程的

线程也就是轻量级的进程,多线程允许一次执行多个线程,Python是多线程语言,它有一个多线程包,GIL也就是全局解释器锁,以确保一次执行单个线程,一个线程保存GIL并在将其传递给下一个线程之前执行一些操作,也就产生了并行执行的错觉。

‘捌’ python如何实现线程池

#这个类是线程类,用来在主程序中调用生成一个线程。其实线程池就是线程的集合地,
#能够解决有效统一的管理线程,基本就达到了线程池的目的;
#这一段代码是我的爬虫程序中的一部分,希望对你有用。
classSpider(Thread):
def__init__(self,todo_list):
super().__init__()
self.setDaemon(True)
self.todo_list=todo_list
self.stat=IDLE

defis_idle(self):
returnself.stat==IDLE

defrun(self):
whileTrue:
url=self.todo_list.get()

#开始线程工作


#这个函数就是主函数了,
defmain(max_threads):
########这里和上一个函数就是核心代码了。
#创建N个线程,并启动
print('Spawnspiders')
spiders=[Spider(todo_list)foriinrange(max_threads)]
forspdinspiders:
spd.start()


#python主运行代码:
if__name__=='__main__':
main(max_threads)

只能给你这么多解释了,如果想弄懂,还是要去看看基础知识的。

另外可以查一下有没有封装好的三方库。

‘玖’ python 同步框架中使用线程池是否有意义



简单地说就是作为可能是仅有的支持多线程的解释型语言(perl的多线程是残疾,PHP没有多线程),Python的多线程是有compromise的,在任意时间只有一个Python解释器在解释Python bytecode。

如果你的代码是CPU密集型,多个线程的代码很有可能是线性执行的。所以这种情况下多线程是鸡肋,效率可能还不如单线程因为有context switch
但是:如果你的代码是IO密集型,多线程可以明显提高效率。例如制作爬虫(我就不明白为什么Python总和爬虫联系在一起…不过也只想起来这个例子…),绝大多数时间爬虫是在等待socket返回数据。这个时候C代码里是有release GIL的,最终结果是某个线程等待IO的时候其他线程可以继续执行。
反过来讲:你就不应该用Python写CPU密集型的代码…效率摆在那里…
如果确实需要在CPU密集型的代码里用concurrent,就去用multiprocessing库。这个库是基于multi process实现了类multi thread的API接口,并且用pickle部分地实现了变量共享。
再加一条,如果你不知道你的代码到底算CPU密集型还是IO密集型,教你个方法:
multiprocessing这个mole有一个mmy的sub mole,它是基于multithread实现了multiprocessing的API。

热点内容
官方版的时空猎人怎么改密码 发布:2024-12-28 18:12:28 浏览:323
万能钥匙wifi破解不了密码怎么办 发布:2024-12-28 18:03:41 浏览:162
上传义乌购 发布:2024-12-28 17:57:59 浏览:280
python网络开发 发布:2024-12-28 17:56:36 浏览:511
androidisvisible 发布:2024-12-28 17:51:43 浏览:513
安卓系统如何卡游戏首充优惠 发布:2024-12-28 17:30:51 浏览:478
收银机密码忘了怎么办 发布:2024-12-28 17:24:57 浏览:653
开源服务器怎么登陆 发布:2024-12-28 17:22:47 浏览:268
微信无法清理缓存 发布:2024-12-28 17:19:34 浏览:19
哪个安卓相机和苹果差不多 发布:2024-12-28 16:52:34 浏览:187