当前位置:首页 » 编程语言 » threadingpython

threadingpython

发布时间: 2022-12-29 23:03:37

‘壹’ python threading start 什么意思

启动多线程

threading是Python多线程模块thread,threading,Queue中的一个

不同于thread的是,你要去覆写threading这个类,然后在里面实现他的一些方法

例如,你程序中有一个方法

importthreading

classrunner(threading.Thread):
'''
实现多线程
'''
def__init__(self,url):
#初始化,设置传入的参数
threading.Thread.__init__(self)
self.url=url
self.thread_stop=False
defrun(self):
tmp=crawl(self.url)#调用一个其它方法
save(tmp)#另一个方法
defstop(self):
self.thread_stop=True

url='.com'
t=runner(url)
t.start()#启动多线程

‘贰’ Python多线程总结

在实际处理数据时,因系统内存有限,我们不可能一次把所有数据都导出进行操作,所以需要批量导出依次操作。为了加快运行,我们会采用多线程的方法进行数据处理, 以下为我总结的多线程批量处理数据的模板:

主要分为三大部分:


共分4部分对多线程的内容进行总结。

先为大家介绍线程的相关概念:

在飞车程序中,如果没有多线程,我们就不能一边听歌一边玩飞车,听歌与玩 游戏 不能并行;在使用多线程后,我们就可以在玩 游戏 的同时听背景音乐。在这个例子中启动飞车程序就是一个进程,玩 游戏 和听音乐是两个线程。

Python 提供了 threading 模块来实现多线程:

因为新建线程系统需要分配资源、终止线程系统需要回收资源,所以如果可以重用线程,则可以减去新建/终止的开销以提升性能。同时,使用线程池的语法比自己新建线程执行线程更加简洁。

Python 为我们提供了 ThreadPoolExecutor 来实现线程池,此线程池默认子线程守护。它的适应场景为突发性大量请求或需要大量线程完成任务,但实际任务处理时间较短。

其中 max_workers 为线程池中的线程个数,常用的遍历方法有 map 和 submit+as_completed 。根据业务场景的不同,若我们需要输出结果按遍历顺序返回,我们就用 map 方法,若想谁先完成就返回谁,我们就用 submit+as_complete 方法。

我们把一个时间段内只允许一个线程使用的资源称为临界资源,对临界资源的访问,必须互斥的进行。互斥,也称间接制约关系。线程互斥指当一个线程访问某临界资源时,另一个想要访问该临界资源的线程必须等待。当前访问临界资源的线程访问结束,释放该资源之后,另一个线程才能去访问临界资源。锁的功能就是实现线程互斥。

我把线程互斥比作厕所包间上大号的过程,因为包间里只有一个坑,所以只允许一个人进行大号。当第一个人要上厕所时,会将门上上锁,这时如果第二个人也想大号,那就必须等第一个人上完,将锁解开后才能进行,在这期间第二个人就只能在门外等着。这个过程与代码中使用锁的原理如出一辙,这里的坑就是临界资源。 Python 的 threading 模块引入了锁。 threading 模块提供了 Lock 类,它有如下方法加锁和释放锁:

我们会发现这个程序只会打印“第一道锁”,而且程序既没有终止,也没有继续运行。这是因为 Lock 锁在同一线程内第一次加锁之后还没有释放时,就进行了第二次 acquire 请求,导致无法执行 release ,所以锁永远无法释放,这就是死锁。如果我们使用 RLock 就能正常运行,不会发生死锁的状态。

在主线程中定义 Lock 锁,然后上锁,再创建一个子 线程t 运行 main 函数释放锁,结果正常输出,说明主线程上的锁,可由子线程解锁。

如果把上面的锁改为 RLock 则报错。在实际中设计程序时,我们会将每个功能分别封装成一个函数,每个函数中都可能会有临界区域,所以就需要用到 RLock 。

一句话总结就是 Lock 不能套娃, RLock 可以套娃; Lock 可以由其他线程中的锁进行操作, RLock 只能由本线程进行操作。

‘叁’ Python Threading 是怎么的用法

多线程/多进程都是通讯或者回调,而不是直接返回结果。这个很容易理解的,因为如果你用返回结果来给一个变量赋值,你就必须等待这个函数结束,你这个程序就阻塞了,这就失去了多线程/多进程防止阻塞的意义了。 通讯可以是事件驱动或者用线程安全

‘肆’ python threading代理对象怎么传递

先来看这段代码:
import threading
import time
def worker():
print “worker”
time.sleep(1)
return
for i in xrange(5):
t = threading.Thread(target=worker)
t.start()
这段代码就使用了多线程,但是没法传递参数,而实际使用多线程,往往是需要传递参数的,于是问了一位群里的网友后,知道可以这么写实现传递参数的多线程:
import threading
import time
def worker(number):
print “worker”
time.sleep(number)
return
for i in xrange(5):
t = threading.Thread(target=worker,args=(i,))
t.start()
第一个参数是线程函数变量,第二个参数args是一个数组变量参数,如果只传递一个值,就只需要i, 如果需要传递多个参数,那么还可以继续传递下去其他的参数,其中的逗号不能少,少了就不是数组了,就会出错。

‘伍’ python threading是什么库

Python通过两个标准库thread和threading提供对线程的支持。thread提供了低级别的、原始的线程以及一个简单的锁。threading模块不仅提供了thread类,还提供了各种同步机制

‘陆’ python的Threading怎么返回值

class QueryWork(Thread):
api={}
flag=''
def __init__(self,queue,target,func_list=None, hook):
Thread.__init__(self)
self.queue=queue
self.target=target
self.hook = hook

def run(self):
mutex=threading.Lock()
try:
while 1:
mutex.acquire()
api=self.queue.get(False)
q=Query(self.target)
self.api,self.flag=q.queryRegister(api)
self.hook(self.api, self.flag)
print self.api['website'],self.api['weburl'],self.flag
mutex.release()

except Exception,e:
pass

def getRet(self):
return (self.api, self.flag)

def hook(zapi, zflag):
print zapi, zflag

‘柒’ Python多线程之threading之Lock对象

要介绍Python的 threading 模块中的 Lock 对象前, 首先应该了解以下两个概念:

1.基本概念 : 指某个函数/函数库在多线程环境中被调用时, 能够正确地处理多个线程之间的 共享变量 , 使程序功能正常完成. 多个线程访问同一个对象时, 如果不用考虑这些线程在运行时环境下的调度和交替执行, 也不需要进行额外的同步, 或者在调用方进行任何其他操作,调用这个对象的行为都可以获得正确的结果, 那么这个对象就是线程安全的. 或者说: 一个类或者程序所提供的接口对于线程来说是 原子操作 或者多个线程之间的切换不会导致该接口的执行结果存在二义性, 也就是说我们不用考虑同步的问题.

2.示例 : 比如有间银行只有1000元, 而两个人同时提领1000元时,就有可能拿到总计2000元的金额. 为了避免这个问题, 该间银行提款时应该使用 互斥锁 , 即意味着对同一个资源处理时, 前一个提领交易完成后才处理下一笔交易.

3.线程安全意义 :

4.是否线程安全 :

5.资源竞争 : 即多个线程对同一个资源的改写时, 存在的一种竞争. 如果仅仅是读操作, 则不存在资源竞争的情况.

1.基本概念 : 因为存在上述所说的 线程安全与资源竞争 的情况, 所以引入了 线程锁 . 即通过锁来进行资源请求的限制, 以保证同步执行,避免资源被污染或预期结果不符. 线程锁存在两种状态: 锁定(locked)和非锁定(unlocked).

2.基本方法 :

3.使用示例 :

上述示例如果在不加锁的情况下, 将会出现打印顺序混乱的情况, 不过最终结果都是正确的, 因为即使线程交替执行, 但最终的结果都是一致.

‘捌’ Python:进程(threading)

这里是自己写下关于 Python 跟进程相关的 threading 模块的一点笔记,跟有些跟 Linux 调用挺像的,有共通之处。

https://docs.python.org/3/library/threading.html?highlight=threading#thread-objects

直接传入

继承 Thread 重写 run 方法

threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)

group 线程组,未实现

start() 线程就绪
join([timeout]) 阻塞其他线程,直到调用这方法的进程结束或时间到达

RuntimeError: cannot join thread before it is started

get/setName(name) 获取/设置线程名。
isAlive() 返回线程是否在运行。
is/setDaemon(bool): 获取/设置是后台线程(默认前台线程(False))。(在start之前设置)

The entire Python program exits when no alive non-daemon threads are left.
没有非后台进程运行,Python 就退出。
主线程执行完毕后,后台线程不管是成功与否,主线程均停止

t.start()
t.join()
start() 后 join() 会顺序执行,失去线程意义

https://docs.python.org/3/library/threading.html?#lock-objects

Lock属于全局,Rlock属于线程(R的意思是可重入,线程用Lock的话会死锁,来看例子)

acquire(blocking=True, timeout=-1) 申请锁,返回申请的结果
release() 释放锁,没返回结果

https://docs.python.org/3/library/threading.html#condition-objects

可以在构造时传入rlock lock实例,不然自己生成一个。

acquire([timeout])/release(): 与lock rlock 相同
wait([timeout]): 调用这个方法将使线程进入等待池,并释放锁。调用方法前线程必须已获得锁定,否则将抛出异常。
notify(): 调用这个方法将从等待池挑选一个线程并通知,收到通知的线程将自动调用acquire()尝试获得锁定(进入锁定池);其他线程仍然在等待池中。调用这个方法不会释放锁定。调用方法前线程必须已获得锁定,否则将抛出异常。
notifyAll(): 调用这个方法将通知等待池中所有的线程,这些线程都将进入锁定池尝试获得锁定。调用这个方法不会释放锁定。使用前线程必须已获得锁定,否则将抛出异常。

threading.Semaphore(value=1)

https://docs.python.org/3/library/threading.html#semaphore-objects

acquire(blocking=True, timeout=None)
资源数大于0,减一并返回,等于0时等待,blocking为False不阻塞进程
返回值是申请结果
release()
资源数加1

https://docs.python.org/3/library/threading.html#event-objects

事件内置了一个初始为False的标志

is_set() 返回内置标志的状态
set() 设为True
clear() 设为False
wait(timeout=None) 阻塞线程并等待,为真时返回。返回值只会在等待超时时为False,其他情况为True

https://docs.python.org/3/library/threading.html#timer-objects

threading.Timer(interval, function, args=None, kwargs=None)

第一个参数是时间间隔,单位是秒,整数或者浮点数,负数不会报错直接执行不等待
可以用cancel() 取消

https://docs.python.org/3/library/threading.html#barrier-objects

threading.Barrier(parties, action=None, timeout=None)

调用的进程数目达到第一个设置的参数就唤醒全部进程

wait(timeout=None)
reset() 重置,等待中的进程收到 BrokenBarrierError 错误

‘玖’ python中的threading怎么用

hread 是threading模块中最重要的类之一,可以使用它来创建线程。有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法;另一种是创建一个threading.Thread对象,在它的初始化函数(__init__)中将可调用对象作为参数传入。下面分别举例说明。先来看看
-------我是华丽的分割线---------
不懂可以继续追问
会给你更好地建议,帮助解决可困难,喂网络知道做贡献

热点内容
python程序设计第三版课后答案 发布:2025-07-03 03:58:08 浏览:212
socket上传文件 发布:2025-07-03 03:57:24 浏览:893
安卓cleo脚本 发布:2025-07-03 03:41:26 浏览:245
编程器解读 发布:2025-07-03 03:22:49 浏览:24
中国电信加密通信业务 发布:2025-07-03 03:06:00 浏览:521
脚本家的台词 发布:2025-07-03 03:05:50 浏览:709
arcgisforpython 发布:2025-07-03 03:05:46 浏览:899
期计算法 发布:2025-07-03 02:56:53 浏览:405
不同域访问 发布:2025-07-03 02:49:05 浏览:819
多槽编程 发布:2025-07-03 02:47:42 浏览:920