python线程里面再创建线程,python多线程创建

  python线程里面再创建线程,python多线程创建

  本文为大家带来了一些关于python的知识,包括线程的创建和常用方法,以及一些线程的演示案例。来看看吧,希望对你有帮助。

  推荐:python视频教程

  00-1010 Python中有很多多线程模块,其中最常用的就是线程模块。让我们来看看如何使用线程创建线程及其常用方法。

  00-1010函数名介绍示例线程创建Thread(target,args)Thread)动能介绍:通过调用线程模块的Thread类实例化一个Thread对象;它有两个参数:target和args(与创建流程时的参数相同)。Target是创建线程时要执行的函数,args是执行这个函数需要传入的参数。

  00-1010我们来看看线程对象中常用的方法:

  函数名称用法介绍start start thread start()join阻塞线程直到线程执行结束join(timeout=None)getName获取线程名称getName()setName设置线程名称setName(name)is_alive判断线程是否存活is _ alive()set daemon set daemon(True)start函数:启动一个线程;没有返回值和参数。Join函数:与流程中的join函数相同;阻塞当前程序,主线程的任务需要等待当前子线程的任务完成后才能继续执行;参数是timeout:表示阻塞的超时时间。GetName函数:获取当前线程的名称。Set函数:设置当前线程的名称;参数名称:是字符串类型is_alive函数:确定当前线程状态是否有货;setDaemon函数:它是一个守护线程;如果脚本任务完成,即使进程池尚未完成,业务也会被强制终止。子线程也是如此。如果希望主进程或主进程先完成自己的业务,同时仍然允许子线程继续工作,而不是强行关闭它们,只需要将setDaemon()设置为true。PS:通过上面的介绍,会发现thread对象中的函数和process对象中的函数差不多,使用方法和使用场景也差不多。

  00-1010

线程的创建与使用

在演示多线程之前,先来看看下面这个案例,看看操作之后需要多长时间。

  1.定义一个列表,在里面写一些东西。

  2.定义一个新列表,并用

  机写入到新列表中;并且删除上一个列表中随机获取到的内容。

  3、这里需要使用到 r andom 内置模块

  代码示例如下:

  

# coding:utf-8import timeimport random

  old_lists = ['罗马假日', '怦然心动', '时空恋旅人', '天使爱美丽', '天使之城', '倒霉爱神', '爱乐之城']new_lists = []def work():

   if len(old_lists) == 0: # 判断 old_list 的长度,如果为0 ,则表示 该列表的内容已经被删光了

   return '\'old_list\' 列表内容已经全部删除'

   old_choice_data = random.choice(old_lists) # random 模块的 choice函数可以随机获取传入的 old_list 的元素

   old_lists.remove(old_choice_data) # 当获取到这个随机元素之后,将该元素从 old_lists 中删除

   new_choice_data = '%s_new' % old_choice_data # 将随机获取到的随机元素通过格式化方式重新赋值,区别于之前的元素

   new_lists.append(new_choice_data) # 将格式化的新的随机元素添加至 new_lists 列表

   time.sleep(1)if __name__ == '__main__':

   strat_time = time.time()

   for i in range(len(old_lists)):

   work()

   if len(old_lists) ==0:

   print('\'old_lists\' 当前为:{}'.format(None))

   else:

   print(('\'old_lists\' 当前为:{}'.format(old_lists)))

   if not len(new_lists) == 0:

   print(('\'new_lists\' 当前为:{}'.format(new_lists)))

   else:

   print('\'new_lists\' 当前为:{}'.format(None))

   end_time = time.time()

   print('运行结束,累计耗时:{} 秒'.format(end_time - strat_time))

运行结果如下:

  


  从运行输出结果我们可以看到整个脚本运行共计耗时7秒,而且 new_lists 列表内的元素都经过格式化处理后加上了 _new ;不仅如此, 因为 random模块的choice函数 原因,new_lists 的内容顺序与 old_lists 也是不一样;每次运行顺序都会不一样,所以 old_lists 的顺序是无法得到保障的。

  


多线程演示案例

代码示例如下:

  

# coding:utf-8import timeimport randomimport threading

  old_lists = ['罗马假日', '怦然心动', '时空恋旅人', '天使爱美丽', '天使之城', '倒霉爱神', '爱乐之城']new_lists = []def work():

   if len(old_lists) == 0: # 判断 old_list 的长度,如果为0 ,则表示 该列表的内容已经被删光了

   return '\'old_list\' 列表内容已经全部删除'

   old_choice_data = random.choice(old_lists) # random 模块的 choice函数可以随机获取传入的 old_list 的元素

   old_lists.remove(old_choice_data) # 当获取到这个随机元素之后,将该元素从 old_lists 中删除

   new_choice_data = '%s_new' % old_choice_data # 将随机获取到的随机元素通过格式化方式重新赋值,区别于之前的元素

   new_lists.append(new_choice_data) # 将格式化的新的随机元素添加至 new_lists 列表

   time.sleep(1)if __name__ == '__main__':

   strat_time = time.time()

   print('\'old_lists\'初始长度为:{}'.format(len(old_lists))) # 获取 old_lists 与 new_lists 最初始的长度

   print('\'new_lists\'初始长度为:{}'.format(len(new_lists)))

   thread_list = [] # 定义一个空的 thread_list 对象,用以下方添加每个线程

   for i in range(len(old_lists)):

   thread_work = threading.Thread(target=work) # 定义一个线程实例化对象执行 work 函数,因为 work 函数没有参数所以不用传 args

   thread_list.append(thread_work) # 将 thread_work 添加进 thread_list

   thread_work.start() # 启动每一个线程

   for t in thread_list: # 通过for循环将每一个线程进行阻塞

   t.join()

   if len(old_lists) ==0:

   print('\'old_lists\' 当前为:{}'.format(None), '当前长度为:{}'.format(len(old_lists)))

   else:

   print(('\'old_lists\' 当前为:{}'.format(old_lists)))

   if not len(new_lists) == 0:

   print('\'new_lists\' 当前长度为:{}'.format(len(new_lists)))

   print('\'new_lists\' 当前的值为:{}'.format(new_lists))

   else:

   print('\'new_lists\' 当前为:{}'.format(None))

   end_time = time.time()

   print('运行结束,累计耗时:{} 秒'.format(end_time - strat_time))

运行结果如下:

  


  从运行的结果来看,我们初始的单线程任务耗时为 7秒,在使用多线程之后,仅耗时 1秒就完成了,大大的提高了我们的运行效率。

  


线程的问题

通过上面的练习,我们发现线程的使用方法几乎与进程是一模一样的。它们都可以互不干扰的执行程序,也可以使得主线程的程序不需要等待子线程的任务完成之后再去执行。只不过刚刚的演示案例中我们使用了 join() 函数进行了阻塞,这里可以吧 join() 去掉,看看执行效果。

  与进程一样,线程也存在着一定的问题。

  

  • 线程执行的函数,也同样是无法获取返回值的。
  • 当多个线程同时修改文件一样会造成被修改文件的数据错乱的错误(因为都是并发去操作一个文件,特别是在处理交易场景的时候,需要尤为注意)。
关于这些线程中存在的问题同样是可以解决的,在下一章节的 线程池与全局锁 我们会有详细的介绍。

  推荐学习:python视频教程以上就是Python线程的创建与常用方法(实例详解)的详细内容,更多请关注盛行IT软件开发工作室其它相关文章!

  

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: