全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Python 多线程Threading初学教程

1.1 什么是多线程 Threading

多线程可简单理解为同时执行多个任务。

多进程和多线程都可以执行多个任务,线程是进程的一部分。线程的特点是线程之间可以共享内存和变量,资源消耗少(不过在Unix环境中,多进程和多线程资源调度消耗差距不明显,Unix调度较快),缺点是线程之间的同步和加锁比较麻烦。

1.2 添加线程 Thread

导入模块

import threading

获取已激活的线程数

threading.active_count()

查看所有线程信息

threading.enumerate()

查看现在正在运行的线程

threading.current_thread()

添加线程,threading.Thread()接收参数target代表这个线程要完成的任务,需自行定义

def thread_job():
  print('This is a thread of %s' % threading.current_thread())
def main():
  thread = threading.Thread(target=thread_job,)  # 定义线程 
  thread.start() # 让线程开始工作
  if __name__ == '__main__':
  main()

1.3 join 功能

因为线程是同时进行的,使用join功能可让线程完成后再进行下一步操作,即阻塞调用线程,直到队列中的所有任务被处理掉。

import threading
import time
def thread_job():
  print('T1 start\n')
  for i in range(10):
    time.sleep(0.1)
  print('T1 finish\n')
def T2_job():
  print('T2 start\n')
  print('T2 finish\n')
def main():
  added_thread=threading.Thread(target=thread_job,name='T1')
  thread2=threading.Thread(target=T2_job,name='T2')
  added_thread.start()
  #added_thread.join()
  thread2.start()
  #thread2.join()
  print('all done\n')
if __name__=='__main__':
   main()

例子如上所示,当不使用join功能的时候,结果如下图所示:

当执行了join功能之后,T1运行完之后才运行T2,之后再运行print(‘all done')

1.4 储存进程结果 queue

 queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递

 (1)基本FIFO队列

 class queue.Queue(maxsize=0)

maxsize是整数,表明队列中能存放的数据个数的上限,达到上限时,插入会导致阻塞,直至队列中的数据被消费掉,如果maxsize小于或者等于0,队列大小没有限制

(2)LIFO队列 last in first out后进先出

class queue.LifoQueue(maxsize=0)

(3)优先级队列

class queue.PriorityQueue(maxsize=0)

视频中的代码,看的还不是特别明白

import threading
import time
from queue import Queue
def job(l,q):
  for i in range(len(l)):
    l[i]=l[i]**2
  q.put(l)
def multithreading():
  q=Queue()
  threads=[]
  data=[[1,2,3],[3,4,5],[4,5,6],[5,6,7]]
  for i in range(4):
    t=threading.Thread(target=job,args=(data[i],q))
    t.start()
    threads.append(t)
  for thread in threads:
    thread.join()
  results=[]
  for _ in range(4):
    results.append(q.get())
  print(results)
if __name__=='__main__':
   multithreading()

运行结果如下所示

图片截取来源:http://www.cnblogs.com/itogo/p/5635629.html

1.5 GIL 不一定有效率

Global Interpreter Lock全局解释器锁,python的执行由python虚拟机(也成解释器主循环)控制,GIL的控制对python虚拟机的访问,保证在任意时刻,只有一个线程在解释器中运行。在多线程环境中能,python虚拟机按照以下方式执行:

1.设置 GIL

2.切换到一个线程去运行

3.运行:

a.指定数量的字节码指令,或

b.线程主动让出控制(可以调用time.sleep(0))

4.把线程设置为睡眠状态

5.解锁GIL

6.重复1-5

在调用外部代码(如C/C++扩展函数)的时候,GIL将会被锁定,直到这个函数结束为止(由于在这期间没有python的字节码被运行,所以不会做线程切换)。

下面为视频中所举例的代码,将一个数扩大4倍,分为正常方式、以及分配给4个线程去做,发现耗时其实并没有相差太多量级。

import threading
from queue import Queue
import copy
import time
def job(l, q):
  res = sum(l)
  q.put(res)
def multithreading(l):
  q = Queue()
  threads = []
  for i in range(4):
    t = threading.Thread(target=job, args=(copy.copy(l), q), name='T%i' % i)
    t.start()
    threads.append(t)
  [t.join() for t in threads]
  total = 0
  for _ in range(4):
    total += q.get()
  print(total)
def normal(l):
  total = sum(l)
  print(total)
if __name__ == '__main__':
  l = list(range(1000000))
  s_t = time.time()
  normal(l*4)
  print('normal: ',time.time()-s_t)
  s_t = time.time()
  multithreading(l)
  print('multithreading: ', time.time()-s_t)

运行结果为:

1.6 线程锁 Lock

如果线程1得到了结果,想要让线程2继续使用1的结果进行处理,则需要对1lock,等到1执行完,再开始执行线程2。一般来说对share memory即对共享内存进行加工处理时会用到lock。

import threading
def job1():
  global A, lock #全局变量
  lock.acquire() #开始lock
  for i in range(10):
    A += 1
    print('job1', A)
  lock.release() #释放
def job2(): 
  global A, lock
  lock.acquire()
  for i in range(10):
    A += 10
    print('job2', A)
  lock.release()
if __name__ == '__main__':
  lock = threading.Lock()
  A = 0
  t1 = threading.Thread(target=job1)
  t2 = threading.Thread(target=job2)
  t1.start()
  t2.start()
  t1.join()
  t2.join()

运行结果如下所示:

总结

以上所述是小编给大家介绍的Python 多线程Threading初学教程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# python  # 多线程  # threading  # python多线程threading.Lock锁用法实例  # Python多线程threading和multiprocessing模块实例解析  # Python多线程threading模块用法实例分析  # Python多线程threading join和守护线程setDeamon原理详解  # python 多线程中子线程和主线程相互通信方法  # python子线程退出及线程退出控制的代码  # python主线程捕获子线程的方法  # python从子线程中获得返回值的方法  # python主线程与子线程的结束顺序实例解析  # Python 多线程  # threading模块  # 创建子线程的两种方式示例  # python实现守护进程、守护线程、守护非守护并行  # Python多线程Threading、子线程与守护线程实例详解  # 所示  # 多个  # 小编  # 中能  # 太多  # 将会  # 在这  # 在此  # 适用于  # 数据结构  # 给大家  # 去做  # 只有一个  # 要对  # 设置为  # 后才  # 较快  # 会做  # 所述 


相关文章: 网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  已有域名和空间如何快速搭建网站?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  香港服务器WordPress建站指南:SEO优化与高效部署策略  建站主机CVM配置优化、SEO策略与性能提升指南  在线制作视频网站免费,都有哪些好的动漫网站?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  微信h5制作网站有哪些,免费微信H5页面制作工具?  专业网站建设制作报价,网页设计制作要考什么证?  成都网站制作报价公司,成都工业用气开户费用?  如何快速搭建个人网站并优化SEO?  网站按钮制作软件,如何实现网页中按钮的自动点击?  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  C#怎么使用委托和事件 C# delegate与event编程方法  如何在阿里云服务器自主搭建网站?  如何快速使用云服务器搭建个人网站?  如何在云指建站中生成FTP站点?  重庆网站制作公司哪家好,重庆中考招生办官方网站?  盘锦网站制作公司,盘锦大洼有多少5G网站?  中山网站推广排名,中山信息港登录入口?  建站之星与建站宝盒如何选择最佳方案?  Android自定义listview布局实现上拉加载下拉刷新功能  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  C++中引用和指针有什么区别?(代码说明)  网站制作公司排行榜,四大门户网站排名?  如何在IIS中配置站点IP、端口及主机头?  如何在橙子建站上传落地页?操作指南详解  建站主机服务器选型指南与性能优化方案解析  自助网站制作软件,个人如何自助建网站?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  建站主机选择指南:服务器配置与SEO优化实战技巧  ,南京靠谱的征婚网站?  高端企业智能建站程序:SEO优化与响应式模板定制开发  建站之星如何配置系统实现高效建站?  如何选择最佳自助建站系统?快速指南解析优劣  建站之星24小时客服电话如何获取?  定制建站流程步骤详解:一站式方案设计与开发指南  如何在腾讯云免费申请建站?  如何通过VPS建站实现广告与增值服务盈利?  建站之星免费模板:自助建站系统与智能响应式一键生成  网站制作难吗安全吗,做一个网站需要多久时间?  如何快速查询网站的真实建站时间?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  网站制作话术技巧,网站推广做的好怎么话术?  临沂网站制作企业,临沂第三中学官方网站?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  建站之星展会模板:智能建站与自助搭建高效解决方案 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。