Python线程整理

线程有五种状态 

新建、就绪、运行、阻塞、死亡。 

阻塞有三种情况: 

同步阻塞是指处于竞争锁定的状态,线程请求锁定时将进入这个状态,一旦成功获得锁定又恢复到运行状态;

等待阻塞是指等待其他线程通知的状态,线程获得条件锁定后,调用“等待”将进入这个状态,一旦其他线程发出通知,线程将进入同步阻塞状态,再次竞争条件锁定;

而其他阻塞是指调用time.sleep()、anotherthread.join()或等待IO时的阻塞,这个状态下线程不会释放已获得的锁定。

python提供了两种使用线程的方式,一种是函数式的,一种是类包装的。 

   * thread 
   * threading 

1、thread: 

立即学习“Python免费学习笔记(深入)”;

>>> import thread>>> dir(thread)['LockType', '__doc__', '__name__', '__package__', '_count', '_local', 'allocate', 'allocate_lock', 'error', 'exit', 'exit_thread', 'get_ident', 'interrupt_main', 'stack_size', 'start_new', 'start_new_thread']

登录后复制

thread.start_new_thread ( function , args [ , kwargs ] ) 
调用thread模块中的start_new_thread()函数来产生新的线程。 

2、threading: 

>>> import threading>>> dir(threading)['BoundedSemaphore', 'Condition', 'Event', 'Lock', 'RLock', 'Semaphore', 'Thread', 'ThreadError', 'Timer', '_BoundedSemaphore', '_Condition', '_DummyThread', '_Event', '_MainThread', '_RLock', '_Semaphore', '_Timer', '_VERBOSE', '_Verbose', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_active', '_active_limbo_lock', '_after_fork', '_allocate_lock', '_counter', '_enumerate', '_format_exc', '_get_ident', '_limbo', '_newname', '_pickSomeNonDaemonThread', '_profile_hook', '_shutdown', '_sleep', '_start_new_thread', '_sys', '_test', '_time', '_trace_hook', 'activeCount', 'active_count', 'currentThread', 'current_thread', 'deque', 'enumerate', 'local', 'setprofile', 'settrace', 'stack_size', 'warnings']

登录后复制

>>> dir(threading.Thread)['_Thread__bootstrap', '_Thread__bootstrap_inner', '_Thread__delete', '_Thread__exc_clear', '_Thread__exc_info', '_Thread__initialized', '_Thread__stop', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_block', '_note', '_reset_internal_locks', '_set_daemon', '_set_ident', 'daemon', 'getName', 'ident', 'isAlive', 'isDaemon', 'is_alive', 'join', 'name', 'run', 'setDaemon', 'setName', 'start']

登录后复制

threading 模块提供的常用方法: 

threading.currentThread(): 返回当前的线程变量。

threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。

threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

继承threading.Thread方法,重写run方法。 

threading.Thread类的初始化函数原型:def __init__(self, group=None, target=None, name=None, args=(), kwargs={}) 
  参数group是预留的,用于将来扩展; 
  参数target是一个可调用对象(也称为活动[activity]),在线程启动后执行; 
  参数name是线程的名字。默认值为“Thread-N“,N是一个数字。 
  参数args和kwargs分别表示调用target时的参数列表和关键字参数。 

join()方法,调用该方法的线程将等待直到该Thread对象完成,再恢复运行。 
调用Thread.join将会使主调线程堵塞,直到被调用线程运行结束或超时。参数timeout是一个数值类型,表示超时时间,如果未提供该参数,那么主调线程将一直堵塞到被调线程结束。 

threading.Lock对象:mutex,有acquire()和release()方法 

RLock允许在同一线程中被多次acquire。而Lock却不允许这种情况。注意:如果使用RLock,那么acquire和release必须成对出现,即调用了n次acquire,必须调用n次的release才能真正释放所占用的琐。 

threading.Condition对象:condition variable,建立该对象时,会包含一个Lock对象(因为condition variable总是和mutex一起使用)。可以对Condition对象调用acquire()和release()方法,以控制潜在的Lock对象。 

Condition.wait([timeout]):  wait方法释放内部所占用的琐,同时线程被挂起,直至接收到通知被唤醒或超时(如果提供了timeout参数的话)。当线程被唤醒并重新占有琐的时候,程序才会继续执行下去。

Condition.notify():  唤醒一个挂起的线程(如果存在挂起的线程)。注意:notify()方法不会释放所占用的琐。

Condition.notifyAll()  唤醒所有挂起的线程(如果存在挂起的线程)。注意:这些方法不会释放所占用的琐。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2281617.html

(0)
上一篇 2025年2月27日 18:47:53
下一篇 2025年2月19日 13:47:40

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • python xapian存储结构

    在项目中为了支持搜索服务,我们使用xapian作为后端的搜索引擎.其因性能良好以及易用受到大家欢迎.下面是基本代码:  import xapianimport posixpathdef get_db_path():    XAPIAN_RO…

    编程技术 2025年2月27日
    200
  • python中的国际化使用

    # -*- coding: utf-8 -*-#!/usr/bin/env python”’1.run “python pygettext.py”, will generate file messages.pot2.open messag…

    编程技术 2025年2月27日
    200
  • python gevent实现机制

    之前看的greenlet只是提供了基本的coroutine的作用,是最小的执行单元.但是要想使用,还需要提供一个调度器,来调度什么时候哪些greenlet应该执行.所以看了一下gevent的实现,当前的稳定版本使用的是libev.libev…

    编程技术 2025年2月27日
    200
  • from module import 和 import 的区别

    最近在用codecademy学python,遇到一些题目错误,小小记录一下  如from math import sqrt是把sqrt作为本文件的方法导入进来了,使用的时候只需要直接调用sqrt。 而如果import是import math…

    编程技术 2025年2月27日
    200
  • 短URL生成转换

    主要逻辑: 1, 确定一个包括大小写字母、数据的字符串LS,长度为 L = 26+26+10 = 62 2, 初始化L**N个整数,并作为一个序列push到redis里 3, 当需要转换一个长URL时,先从以上的序列中随机pop出一个整数I…

    编程技术 2025年2月27日
    200
  • python greenlet 实现机制

    最近使用python开发web程序,一直使用的是fastcgi模式.然后每个进程中启动多个线程来进行请求处理.这里有一个问题就是需要保证每个请求响应时间都要特别短,不然只要多请求几次慢的就会让服务器拒绝服务,因为没有线程能够响应请求了.平时…

    编程技术 2025年2月27日
    200
  • 详解python的数字类型变量与其方法

    前言 python数据类型是不允许改变的,这就意味着如果改变 Number 数据类型的值,将重新分配内存空间。下面话不多说,来看看详细的介绍吧。 以下实例在变量赋值时 Number 对象将被创建: var1 = 1var2 = 10 登录后…

    编程技术 2025年2月27日
    200
  • python_bisect模块的使用

    这个模块只有几个函数, 一旦决定使用二分搜索时,立马要想到使用这个模块  import bisect    L = [1,3,3,6,8,12,15]  x = 3    x_insert_point = bisect.bisect_lef…

    编程技术 2025年2月27日
    200
  • python数组查找算法bisect二分查找插入

    1 实例 这个模块只有几个函数, 一旦决定使用二分搜索时,立马要想到使用这个模块  import bisect    L = [1,3,3,6,8,12,15]  x = 3    x_insert_point = bisect.bisec…

    编程技术 2025年2月27日
    200
  • Python 二分查找与 bisect 模块

    python 的列表(list)内部实现是一个数组,也就是一个线性表。在列表中查找元素可以使用 list.index() 方法,其时间复杂度为o(n)。对于大数据量,则可以用二分查找进行优化。二分查找要求对象必须有序,其基本原理如下: 1.…

    编程技术 2025年2月27日
    200

发表回复

登录后才能评论