Py之MT:Multithreaded的简介、引入、使用方法之详细攻略(一)-阿里云开发者社区

开发者社区> 一个处女座的程序猿> 正文

Py之MT:Multithreaded的简介、引入、使用方法之详细攻略(一)

简介: Py之MT:Multithreaded的简介、引入、使用方法之详细攻略
+关注继续查看

案例应用


(1)、T1、创建Thread实例,传给它一个函数



#T1、创建Thread实例,传给它一个函数

import threading  

from time import sleep, ctime  

 

loops = [2,4]                      #睡眠时间  

 

def loop(nloop, nsec):  

   print('Start loop', nloop, 'at:', ctime())  

   sleep(nsec)  

   print('Loop ', nloop, 'done at:', ctime())

     

 

def main():  

   print( 'Starting at:', ctime())

   threads = []                   #添加了一些Thread对象

   nloops = range(len(loops))     #列表[0,1]  

         

   #创建线程:在实例化每个Thread对象时,把函数(target)和参数(args)都传进去,得到返回的Thread实例。

   for i in nloops:  

       #实例化一个Thread调用Thread()方法与调用thread.start_new_thread()之间的最大区别是:

       #新的线程不会立即开始。在你创建线程对象,但不想马上开始运行线程的时候,这是一个很有用的同步特性。

       t = threading.Thread(target=loop,args=(i,loops[i]))  

       threads.append(t)  

 

   #开始线程:Change1:所有的线程都创建之后,再一起调用start()函数启动线程,而不是创建一个启动一个。

   for i in nloops:  

       threads[i].start()  

 

   #等待所有结束线程:threading模块的Thread类有一个join()函数,允许主线程等待线程的结束。

   #Change2:不用再管理一堆锁(分配锁、获得锁、释放锁、检查锁的状态等),只要简单地对每个线程调用join()函数就可以了。

   #        使用join()比使用一个等待锁释放的无限循环清楚一些(也称“自旋锁”)。

   #Tip:如果你的主线程除了等线程结束外,还有其他的事情要做(如处理或等待其他的客户请求),那就不用调用join(),只有在你要等待线程结束的时候才要调用join()。

   for i in nloops:  

       threads[i].join()  

 

   print('All end:', ctime())

 

if __name__ == '__main__':  

   main()


image.png

(2)、T2、创建一个Thread实例,传给它一个可调用的类对象。


    这个方法,与T1方法传递一个函数很相似。但它是传一个可调用的类的实例供线程启动的时候执行,这是多线程编程的一个更为面向对象的方法。相对于一个或几个函数来说,由于类对象里可以使用类请打的功能,可以保存更多的信息,这种方法更为灵活。


#T2、创建一个Thread实例,传给它一个可调用的类对象

#coding=utf-8  

import threading  

from time import sleep, ctime  

 

loops = [2,4]                   #睡眠时间  

#创建Thread对象时会实例化一个可调用类ThreadFunc的类对象。这个类保存了函数的参数,函数本身以及函数的名字字符串

class ThreadFunc(object): #传递的是一个可调用的类,而不是一个函数

 

   def __init__(self, func, args, name=''):  #构造器__init__()函数:初始化赋值工作

       self.name=name  

       self.func=func  

       self.args=args  

 

   def __call__(self):  #特殊函数__call__():由于我们已经有要用的参数,所以就不用再传到Thread()构造器中;

       #由于我们有一个参数的元组,这时python2要在代码中使用apply()函数即Python3中改为下边。

       self.func(*self.args)

 

def loop(nloop, nsec):  

   print('Start loop', nloop, 'at:', ctime())

   sleep(nsec)  

   print('Loop ', nloop, 'done at:', ctime())

 

def main():  

   print('Starting at:', ctime())

   threads=[]  

   nloops = range(len(loops))   #列表[0,1]  

 

   for i in nloops:  

       #调用ThreadFunc类实例化的对象,创建所有线程  

       t = threading.Thread(  

               target=ThreadFunc(loop, (i,loops[i]), loop.__name__)  

           )  

       threads.append(t)  

         

   #开始线程  

   for i in nloops:  

       threads[i].start()  

 

   #等待所有结束线程  

   for i in nloops:  

       threads[i].join()  

 

   print('All end:', ctime())

 

if __name__ == '__main__':  

   main()

image.png


#Python2中的apply函数的讲解

#apply(func [, args [, kwargs ]]) 函数:用于当函数参数已经存在于一个元组或字典中时,间接地调用函数。

#              args是一个包含将要提供给函数的按位置传递的参数的元组。如果省略了args,任何参数都不会被传递,

#              kwargs是一个包含关键字参数的字典。

def say(a, b):  

   print(a, b)

apply(say,("第一个参数", "Python线程"))  #输出得到:第一个参数 Python线程



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
使用Hibernate 过程中 报—— cannot simultaneously fetch multiple bags
解决方法有:   1.将fetchType改为懒加载   2.加上注解@Fetch(FetchMode.SUBSELECT)     @Fetch(FetchMode.SUBSELECT) public List getModels() { return this.
588 0
如何在函数计算中使用 Node.js 处理 multipart 文件上传请求
web 开发中我们经常会允许用户通过 HTTP POST 请求上传文档到服务器,本文将介绍在函数计算中基于 node.js 使用 multipart form-data 来实现文件上传服务。
2663 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
8268 0
[TensorFlow笔记乱锅炖] tf.multinomial(logits, num_samples)使用方法
tf.multinomial(logits, num_samples) 第一个参数logits可以是一个数组,每个元素的值表示对应index的选择概率。假设logits有两个元素,即[0.6,0.4],这表示的意思是取 0 的概率是0.6, 取 1 的概率是0.4。
3156 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
10784 0
使用liner、feather、multiband对已经拼接的数据进行融合(下)
理解mulitband。所谓的mulitband,其实就是一种多尺度的样条融合,其实现的主要方法就是laplace金字塔。高斯金字塔是向下采样,而laplace金字塔式向上采样(也就是恢复),采用的都是差值的方法。
1054 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
3664 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
17375 0
+关注
一个处女座的程序猿
国内互联网圈知名博主、人工智能领域优秀创作者,全球最大中文IT社区博客专家、CSDN开发者联盟生态成员、中国开源社区专家、华为云社区专家、51CTO社区专家、Python社区专家等,曾受邀采访和评审十多次。仅在国内的CSDN平台,博客文章浏览量超过2500万,拥有超过57万的粉丝。
1701
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载