Python多线程之threading之Lock对象

在Python线程模块中添加Lock对象之前,首先要了解以下两个概念:

1.基本概念:指在多线程环境下调用函数/函数库时。
,能够正确处理多个线程之间的共享变量,因此当多个线程访问同一个对象时,程序函数可以正常执行,只要运行时不需要考虑这些线程的调度和顺序执行。
需要在调用方执行额外的同步或任何其他操作,如果该对象的调用行为可以产生正确的结果,则该对象是线程安全的。
换句话说:类或程序暴露的接口是线程上的原子操作,否则多个线程之间的切换不会这样做。
性别接口的实现带来了歧义,这意味着我们不需要考虑同步问题。

2例子:比如银行里只有1000元,两个人取款1000的时候元同时,是有可能的。
拿到2000元的金额就可以避这个问题,银行。
提款时应使用互斥锁,即在处理同一资源时,只有在上一个提款交易完成后才会处理下一个交易。

3.线程安全值:


4.线程安全吗?

5.资源竞争。
争用:这是当多个线程重写同一资源时存在的一种争用。
如果只是读操作,则不存在资源争用。

1基本概念:由于上述。
我们讲的是线程安全和资源争用,所以引入了线程。
阻塞进程。
即用锁来限制资源请求,保证同步执行,避免资源污染或与预期结果不一致。
线程锁存在两种状态:阻塞(锁定)和解锁(已解锁)。

2.基本方法:

3.使用示例:

如果上面的例子没有被阻塞,打印顺序会打乱,但最终结果是正确的,因为即使线程交替执行,但最终结果是相同的.

为什么有人说python的多线程是鸡肋呢?

Python的多线程为何被批评“鸡肋”?此问题是由内部全局解释器锁(GIL)引起的。
GIL的存在意味着在任何给定时间只有一个Python解释器正在执行Python字节码。
这意味着虽然Python支持多线程,但对于CPU密集型任务来说,多线程带来的性能提升往往并不明显。
关注Python中的多线程性能往往会关注IO密集型任务。
这些类型的操作,例如创建爬虫的过程,需要大部分时间等待I/O操作完成。
在这些情况下,多个线程可以同时运行,从而提高整体效率,因为等待I/O操作的线程可以使用其他线程继续执行。
但是,对于CPU密集型任务,多线程的性能可能不如单线程,因为线程之间的切换会带来额外的开销。
因此,对于CPU密集型任务,建议使用Python的多处理库。
多处理通过跨多个进程实现并发,避免GIL的影响,为CPU密集型任务提供更好的性能。
值得注意的是,使用多处理时的变量共享通常需要使用Pickle库。
对于不确定代码类型(CPU密集型还是IO密集型)的场景,可以尝试使用multiprocessing的虚拟子模块,它实现了基于多线程的multiprocessingAPI。
比较使用多处理和多线程实现并发的性能可以帮助您选择更高效的解决方案。
最后值得一提的是,Python的Concurrent.futures库提供了更简单的API,包括ThreadPoolExecutor和ProcessPoolExecutor,在某些情况下可以提供更方便的并发实现。

Python多线程编程之线程守护、变量共享

1.线程守护线程

守护线程是指程序执行完毕后,无论线程执行与否,该线程都会被强制退出。

示例代码如下:

importthreadingimporttimedefrun(n):time.sleep(3)print('task',n)defmain():t1=threading.Thread(target=run),args=('t1',))t1.setDaemon(true)t1.start()print('end')__name__=='__main__':main()

输出:

D:\software\python\python.exeD:/python_record/thread_api_demo.pyendProcessfinishedwithexitcode0

这是因为t1线程是守护线程,当主线程退出时,t1线程只是在完成之前停止。
因此最终输出中不可能出现预期的函数,t1

2多线程共享使用全局变量在线程执行的函数中定义全局变量。
达到线程间共享全局变量的目的,使得线程可以从程序中读取和修改全局变量的值。

importthreadingg_num=100defwork1():globalg_numfor_inrange(3):g_num+=1print('inwork1g_numis:%d'%g_num)defwork2():globalg_numfor_inrange(3):g_num-=3print('inwork2g_numis:%d')defmain():t1=stringing.Thread(target=work1)t2=stringing.stringp>

结果:

inwork1g_numis:103inwork2g_numis:94