python 多线程

本人用的是window系统,所以就基于Windows系统来讲解python多线程的问题。

参考资料:廖雪峰的官方网站

多线程是指在按个进程内开启多个线程。python提供了两个模块来实现多线程,分别为 _thread 以及 threading。其中 _thread为低级模块,而threading为高级模块,大多数情况下我们只是用threading模块就可以完成绝大部分的功能。

启动一个线程就是将你创建的一个函数方法传入并创建 thread 实例,然后调用 start()方法,使用 join() 方法(跟多进程的步骤差不多)即可。下面让我们看一个例子:

import time
import threading

def Solution():
    print("现在正在运行的进程是:{0}".format(threading.current_thread().name))
    for i in range(1,5):
        print("现在{0}正在计数:{1}".format(threading.current_thread().name, i))
        time.sleep(1)
    print("现在{0}正在结束运行".format(threading.current_thread().name))

if __name__ == "__main__":
    print("现在主程序{0}正在运行".format(threading.current_thread().name))
    t = threading.Thread(target=Solution, name="进程1")
    t.start()
    t.join()
    print("主进程{0}正在停止运行".format(threading.current_thread().name))

然后看一下运行的结果:

现在主程序MainThread正在运行
现在正在运行的进程是:进程1
现在进程1正在计数:1
现在进程1正在计数:2
现在进程1正在计数:3
现在进程1正在计数:4
现在进程1正在结束运行
主进程MainThread正在停止运行

 现在我们来分析一下整个代码:

  • 首先我们需要导入需要用到的模块, 其中 time 模块主要是用于休眠计数、threading 模块主要用于创建新的线程
  • 现在来看一下我们创建的  Solution  方法:首先需要打印是哪一个子线程在运行(threading.current_thread().name)为获取当前线程名称的操作;接着使用  for  循环来进行计数,time.sleep(1) 为沉睡一秒钟。等计数完成之后再打印子线程结束
  • 主程序:首先需要打印主线程的名称;然后利用 Thread(target,name)来创建一个新的子线程,target 为你需要调用的方法的名称, name 为你给子进程起得名字,如果没有,那么系统就会自己给进程起名字。接下来就很多进程一样了,调用 方法 start()跟方法  join()。

LOCK  锁

多线程跟多进程最大的不同之处在于,多进程之间的数据操作互不影响,而在多线程中,所有变量由全体变量共享。这种机制有利有弊,利是你可以不用担心多线程之间的通讯问题;弊是你必须要保证你在处理某个变量的同时没有其他变量来同时操作这个变量。这样就需要一个锁 Lock 来锁定某个变量。当我们在操作真个变量的时候,就让你需要的线程来获得这个锁,只有拥有了这把锁你才有资格来更改变量,而其他没有锁的线程不能操作。只有放你释放了这把锁,其他获得这把锁的线程才能继续操作。这样就保证了,在同一阶段只能有一个子线程来操作同一个变量。创建一个锁就是通过  threading.Lock()  来实现:

import time, threading
balance = 0
lock = threading.Lock()
def change_it(n):
    # 先存后取,结果应该为0:
    global balance
    balance = balance + n
    balance = balance - n

def run_thread(n):
    for i in range(100000):
        lock.acquire()
        try:
            change_it(n)
        finally:
            # 改完了一定要释放锁:
            lock.release()
t1 = threading.Thread(target=run_thread, args=(5,))
t2 = threading.Thread(target=run_thread, args=(8,))
t1.start()
t2.start()
t1.join()
t2.join()
print(balance)

现在我们来分析一下代码:

  •  首先导入我们需要的模块,定义一个变量 balance = 0,定义一个锁 lock
  • 创建一个函数 change_it()用来先加后减,按理说结果应该为0。
  • 创建一个run_thread()函数,用来进行加锁处理:首先利用 for 循环,循环调用100000 次,在循环里面请求     acquire()一个锁,利用  try 来调用change_it()函数,finally 来释放锁lock
  • t1 、t2 分别创建一个子线程,接着运行

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python多线程可以使用内置的`threading`模块来实现。这个模块提供了一些对象和方法,可以方便地创建和管理线程。 以下是一个简单的多线程示例,它创建了两个线程,每个线程都打印数字1到5: ```python import threading def print_numbers(): for i in range(1, 6): print(threading.current_thread().name, i) # 创建两个线程 t1 = threading.Thread(target=print_numbers) t2 = threading.Thread(target=print_numbers) # 启动线程 t1.start() t2.start() # 等待线程结束 t1.join() t2.join() print("All threads have finished.") ``` 在这个示例中,我们首先定义了一个`print_numbers()`函数,它用于打印数字1到5,并且在每个数字前面打印线程的名称。然后,我们创建了两个线程`t1`和`t2`,它们都指向`print_numbers()`函数。接下来,我们启动这两个线程,并等待它们完成,最后输出"All threads have finished."。 注意,`threading.current_thread().name`用于获取当前线程的名称。在这个示例中,我们没有指定线程的名称,因此它们将默认为"Thread-1"和"Thread-2"。 多线程可以提高程序的执行效率,但是也需要注意线程安全问题,比如并发访问共享变量可能会导致数据不一致的问题。因此,在编写多线程程序时,需要特别注意线程安全问题。 ### 回答2: Python多线程是指在一个程序中同时执行多个线程,每个线程都可以独立执行不同的任务。Python多线程是基于线程模块实现的,通过创建多个线程对象来实现多线程的功能。 Python多线程的使用需要导入threading模块,使用threading.Thread类来创建线程对象。通过调用线程对象的start()方法,线程就会开始执行。线程可以是执行同一个函数,也可以是执行不同的函数,甚至可以是执行不同的类的方法。 线程之间可以共享全局变量,但需要避免多个线程同时修改全局变量的情况,可以通过互斥锁机制来保证数据的一致性。 Python多线程的优点是能够提高程序的执行效率,特别是在IO操作较多的情况下,多线程可以充分利用CPU的空闲时间。另外,多线程还可以实现一些并发的功能,例如同时下载多个文件、同时处理多个网络请求等。 然而,Python多线程在处理CPU密集型任务上并不适用,因为在Python中,多线程并不能利用多核CPU的优势,由于Python的GIL(全局解释器锁)机制,多线程在CPU密集型任务上的效率并不比单线程高。 总结来说,Python多线程适用于IO密集型任务,能够提高程序的执行效率和实现并发的功能,但对于CPU密集型任务,单线程可能更适合。 ### 回答3: Python 多线程是指在一个程序中同时运行多个线程,每个线程独立执行其任务。Python 中的多线程可以通过使用 threading 模块来实现。 在 Python 中,多线程的主要优势是能够提升程序的执行效率。通过多线程,可以将耗时较长的任务分配给不同的线程来并行执行,从而缩短程序的总执行时间。这尤其适用于那些需要频繁进行网络请求、IO 操作或者计算密集型任务的程序。 使用 Python 的 threading 模块可以很方便地创建和管理线程。通过创建 Thread 对象并传入要执行的函数,就可以创建一个新的线程。可以使用 start() 方法来启动线程,并使用 join() 方法来等待线程执行完成。 需要注意的是,Python 中的多线程并不能真正实现并行执行,而是通过在不同任务之间快速切换来模拟并行。这是由于 Python 的全局解释器锁(GIL)的存在,它使得同一时间只有一个线程能够执行 Python 的字节码。因此,在计算密集型任务上,使用多线程并不能获得真正的并行加速。 另外,多线程在处理共享资源时需要注意线程安全问题。多个线程同时访问和修改共享数据可能会导致数据不一致或者竞争条件。在这种情况下,可以通过使用锁(Lock)等同步机制来确保数据的正确访问和更新。 总而言之,Python 多线程可以提升程序的执行效率,适用于需要进行网络请求、IO 操作或者并发处理的任务。然而,在计算密集型任务上,并不能实现真正的并行加速。同时,在处理共享资源时需要注意线程安全问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值