Python多线程实例

前言

  感觉理解python多线程用“切换”和“共享”就差不多了。这里就贴上一个抢车票的小小实例,还有自己在编程过程中遇到的坑.....

实例:抢车票

抢车票有三类人:会员、弄了加速包、普通人。

说说区别:

  钱带来的不公平:会员先跑,然后加速包,最后普通人

  可以欣慰的公平:跑道一样长

守护线程SetDaemon

不设置守护进程

 1 import threading
 2 import time
 3 #使用函数式
 4
 5 #会员
 6 def vip(t1):
 7     global num
 8     time.sleep(2)   #等待时间相同,区别是进场的先后顺寻
 9     if num == 15:
10         print("用时:", time.time() - t1)
11         exit(0)
12     num += 1
13     print(‘会员,当前被抢票数:‘, num)
14 #有加速包的家伙
15 def aboostOne(t1):
16     global num
17     time.sleep(2)       #等待时间相同,区别是进场的先后顺寻
18     if num == 15:
19         print("用时:",time.time()-t1)
20         exit(0)
21     num+=1
22     print(‘加速包,当前被抢票数:‘, num)
23
24 #没有加速包的苦逼
25 def commonOne(t1):
26     global num
27     time.sleep(2)   #等待时间相同,区别是进场的先后顺寻
28     if num == 15:
29         print("用时:", time.time() - t1)
30         exit(0)
31     num += 1
32     print(‘苦逼青年,当前被抢票数:‘, num)
33
34 if __name__ ==‘__main__‘:
35     t1 =time.time()     #开始时间
36     num =0  #只有15张票
37     #vip优先,来3个
38     for i in range(3):
39         threading.Thread(target=vip,args=(t1,)).start()
40     #加速包其次,来7个
41     for i in range(7):
42         threading.Thread(target=aboostOne,args=(t1,)).start()
43     #苦逼青年最后,来10个
44     for i in range(10):
45         threading.Thread(target=commonOne,args=(t1,)).start()

exam1

结论:

  1.加速包可以抢的比会员卡   ===   多线程不一定按顺序进行

  2.最终打出了5个用时 ===  一个线程exit()之后,其他线程不受影响,继续运行

再看看设置守护

其他代码不变,只给苦逼青年daemon.图中有两种方式

结果:

  苦逼青年抢票被中断,抛出异常  ===  设置守护意味着不重要,主线程退出,守护进程随即被中断

  

join()设置阻塞

在setDaemon的情况下join,只测试苦逼青年的

结果:

  完美运行完了 === join的作用:被join的子线程执行完之后,主线程才能进行。

  这里就算SetDaemon,主线程也带等苦逼青年运行完。SetDaemon后,用join,相当于没有设置守护进程

  作用:当你想做完一些事,再做另一些事,就可以join一下

遇到的坑

  感觉理解python多线程用“切换”和“共享”就差不多了。这里就贴上一个抢车票的小小实例,还有自己在编程过程中遇到的坑.....

实例:抢车票

抢车票有三类人:会员、弄了加速包、普通人。

说说区别:

  钱带来的不公平:会员先跑,然后加速包,最后普通人

  可以欣慰的公平:跑道一样长

守护线程SetDaemon

不设置守护进程

 1 import threading
 2 import time
 3 #使用函数式
 4
 5 #会员
 6 def vip(t1):
 7     global num
 8     time.sleep(2)   #等待时间相同,区别是进场的先后顺寻
 9     if num == 15:
10         print("用时:", time.time() - t1)
11         exit(0)
12     num += 1
13     print(‘会员,当前被抢票数:‘, num)
14 #有加速包的家伙
15 def aboostOne(t1):
16     global num
17     time.sleep(2)       #等待时间相同,区别是进场的先后顺寻
18     if num == 15:
19         print("用时:",time.time()-t1)
20         exit(0)
21     num+=1
22     print(‘加速包,当前被抢票数:‘, num)
23
24 #没有加速包的苦逼
25 def commonOne(t1):
26     global num
27     time.sleep(2)   #等待时间相同,区别是进场的先后顺寻
28     if num == 15:
29         print("用时:", time.time() - t1)
30         exit(0)
31     num += 1
32     print(‘苦逼青年,当前被抢票数:‘, num)
33
34 if __name__ ==‘__main__‘:
35     t1 =time.time()     #开始时间
36     num =0  #只有15张票
37     #vip优先,来3个
38     for i in range(3):
39         threading.Thread(target=vip,args=(t1,)).start()
40     #加速包其次,来7个
41     for i in range(7):
42         threading.Thread(target=aboostOne,args=(t1,)).start()
43     #苦逼青年最后,来10个
44     for i in range(10):
45         threading.Thread(target=commonOne,args=(t1,)).start()

exam1

结论:

  1.加速包可以抢的比会员卡   ===   多线程不一定按顺序进行

  2.最终打出了5个用时 ===  一个线程exit()之后,其他线程不受影响,继续运行

再看看设置守护

其他代码不变,只给苦逼青年daemon.图中有两种方式

结果:

  苦逼青年抢票被中断,抛出异常  ===  设置守护意味着不重要,主线程退出,守护进程随即被中断

  

join()设置阻塞

在setDaemon的情况下join,只测试苦逼青年的

结果:

  完美运行完了 === join的作用:被join的子线程执行完之后,主线程才能进行。

  这里就算SetDaemon,主线程也带等苦逼青年运行完。SetDaemon后,用join,相当于没有设置守护进程

  作用:当你想做完一些事,再做另一些事,就可以join一下

遇到的坑

pymysql.err.InternalError: Packet sequence number wrong - got 45 expected 0

原因:

使用了多线程,多线程共享了同一个数据库连接,但每个execute前没有加上互斥锁

方法:

方法一:每个execute前加上互斥锁

lock.acquire()
        cursor.execute(command,data)     
        lock.release()

方法二:

  每个线程拥有自己的数据库连接,即在线程调用函数中加上数据库连接代码

方法三:

所有线程共用一个连接池,需要考虑线程总数和连接池连接数上限的问题

另外

threading.Thread(target =,args=(,))

  args应当传入Tuble(元组)

  第二:传入的参数不是引用传递,而是新分配了内存。估计是把参数初始化到类的成员里面去了吧

转自:https://www.cnblogs.com/heiao10duan/p/9373237.html

原文地址:https://www.cnblogs.com/vvlj/p/10674003.html

时间: 2024-08-25 13:21:05

Python多线程实例的相关文章

Python 多线程 实例

多线程实例 1 import threading 2 import time 3 4 5 def eat(): 6 eatTime = time.time() 7 for i in range(30): 8 print('count = {}'.format(count)) 9 time.sleep(1) 10 print 'eat something in {}'.format(eatTime) 11 return eatTime 12 13 def playGame(): 14 playTi

python多线程同步实例分析

进程之间通信与线程同步是一个历久弥新的话题,对编程稍有了解应该都知道,但是细说又说不清.一方面除了工作中可能用的比较少,另一方面就是这些概念牵涉到的东西比较多,而且相对较深.网络编程,服务端编程,并发应用等都会涉及到.其开发和调试过程都不直观.由于同步通信机制的原理都是想通的,本文希通过望借助python实例来将抽象概念具体化. 阅读之前可以参考之前的一篇文章:python多线程与多进程及其区别,了解一下线程和进程的创建. python多线程同步 python中提供两个标准库thread和thr

python多线程、多进程以及GIL

多线程 使用threading模块创建线程 传入一个函数 这种方式是最基本的,即调用threading中的Thread类的构造函数,然后指定参数target=func,再使用返回的Thread的实例调用start()方法,即开始运行该线程,该线程将执行函数func,当然,如果func需要参数,可以在Thread的构造函数中传入参数args=(-).示例代码如下 import threading #用于线程执行的函数 def counter(n): cnt = 0; for i in xrange

python多线程爬虫的简单例子

Python多线程(http://www.maiziedu.com/course/python/)主要是通过thread和threading这两个模块来实现的.thread模块是比较底层的模块,threading模块是对thread做了一些包装的,可以更加方便的使用. 虽然python的多线程受GIL限制,并不是真正的多线程,但是对于I/O密集型计算还是能明显提高效率,比如说爬虫. 下面用一个实例来验证多线程的效率.代码只涉及页面获取,并没有解析出来. # -*-coding:utf-8 -*-

python多线程-threading模块

threading 是我们常用的用于 python 多线程的模块,其功能更加丰富.下面我们就来开始学习这个模块. 同样的,我这里声明一样我使用的版本是 python2.7,不同版本直接可能存在差异. 老规矩,使用 help() 函数获取帮助文档,看看里面有什么内容. threading 模块中提供了一个 thread 的类,注意不要和 thread 模块搞混了,两者差别还是很大的.thread 这个类可以实例化一个对象,每个对象代表一个线程,可以调用其中的 run() 方法来开启一个线程的运行.

Python多线程和多进程谁更快?

python多进程和多线程谁更快 python3.6 threading和multiprocessing 四核+三星250G-850-SSD 自从用多进程和多线程进行编程,一致没搞懂到底谁更快.网上很多都说python多进程更快,因为GIL(全局解释器锁).但是我在写代码的时候,测试时间却是多线程更快,所以这到底是怎么回事?最近再做分词工作,原来的代码速度太慢,想提速,所以来探求一下有效方法(文末有代码和效果图) 这里先来一张程序的结果图,说明线程和进程谁更快 一些定义 并行是指两个或者多个事件

[Python]多线程入门

Python的多线程有两种实现方法: 函数,线程类 1.函数 调用thread模块中的start_new_thread()函数来创建线程,以线程函数的形式告诉线程该做什么 # -*- coding: utf-8 -*- import thread def f(name): #定义线程函数 print "this is " + name if __name__ == '__main__': thread.start_new_thread(f, ("thread1",)

python多线程应用——DB2数据库备份

前言:DB2一个实例下,可以存在多个数据库,之前使用shell备份脚本,但是同一时刻只能备份一个数据库,对于几百G的备份文件,这个速度显然太慢,今天学习了Python多线程,刚好应用一下. 分析:1.磁盘I/O允许情况下,使用多线程,节省时间,相当可行. 2.Python多线程在某些场景上是鸡肋,但是对于I/O密集型的场景最为适用,这里刚好. 3.thread模块有诸多问题,这里使用threading模块. 4.先前备份脚本修改端口来清理已连接应用,太过暴力,虽然都为冷备,但每次重启开销太大,这

Python 多线程教程:并发与并行

Python 多线程教程:并发与并行 在批评Python的讨论中,常常说起Python多线程是多么的难用.还有人对 global interpreter lock(也被亲切的称为“GIL”)指指点点,说它阻碍了Python的多线程程序同时运行.因此,如果你是从其他语言(比如C++或Java)转过来的话,Python线程模块并不会像你想象的那样去运行.必须要说明的是,我们还是可以用Python写出能并发或并行的代码,并且能带来性能的显著提升,只要你能顾及到一些事情.如果你还没看过的话,我建议你看看