设为首页 收藏本站
查看: 1058|回复: 0

[经验分享] Python多线程编程实例

[复制链接]

尚未签到

发表于 2018-8-5 08:09:35 | 显示全部楼层 |阅读模式
Python多线程编程
  发布者:lanyulei,转载请注明出处:http://www.fdevops.com/?p=517
  下面多线程模块threading的方法注释,均来自于百度贴吧"学点编程吧"。
  Thread: 表示一个线程的执行对象
  Lock: 锁原语对象(跟Thread模块里的锁对象相同),独占线程资源
  Condition: 条件变量对象能让一个线程停下来,等待其它线程满足了某个“条件”,如状态的改变或值的改变
  Event:通用的条件变量。多个线程可以等待某个事件的发生,在事件发生后,所有的线程都会被激活
  Semaphore为等待锁的线程提供一个类似“等候室”的结构
  BoundedSemaphore与 Semaphore 类似,只是它不允许超过初始值
  Timer与 Thread 相似,只是它要等待一段时间后才开始运行
  activeCount():当前活动的线程对象的数量
  currentThread():返回当前线程对象
  enumerate():返回当前活动线程的列表
  settrace(func):为所有线程设置一个跟踪函数
  setprofile(func):为所有线程设置一个profile 函数
  Thread 对象的函数
  start():开始线程的执行
  run():定义线程的功能的函数(一般会被子类重写)
  join(timeout=None):程序挂起,直到线程结束;如果给了 timeout,则最多阻塞 timeout 秒
  getName():返回线程的名字
  setName(name):设置线程的名字
  isAlive():布尔标志,表示这个线程是否还在运行中
  isDaemon():返回线程的 daemon 标志
  setDaemon(daemonic):把线程的 daemon 标志设为 daemonic(一定要在调用 start()函数前调用)

多线程实例
  多线程与单线程的对比
  代码如下:
  

import threading  
import time
  

  
def sum(n):
  sum = 0
  for i in range(1, n + 1):
  sum += i
  time.sleep(0.001)
  print(sum)
  

  
print("**** Single Thread")
  
time1 = time.time()
  
sum(1000)
  
sum(1000)
  
interval = time.time() - time1
  
print("intervall: ", interval)
  

  
print("**** Multithreading")
  
n = [1000, 1000]
  
mythread = []
  
time2 = time.time()
  

  
# 将线程对象加入到一个列表中
  
for i in range(len(n)):
  t = threading.Thread(target=sum, args=(n,))
  mythread.append(t)
  

  
# 将列表中的线程对象循环启动
  
for i in range(len(n)):
  mythread.start()
  

  
# 等待线程的结束
  
for i in range(len(n)):
  mythread.join()
  

  
interval2 = time.time() - time2
  
print("interval2: ", interval2)
  

  返回结果如下:
  

**** Single Thread  
500500
  
500500
  
intervall:  2.490525245666504
  
**** Multithreading
  
500500
  
500500
  
interval2:  1.8753752708435059
  

  多线程锁的操作
  代码如下:
  

import threading  

  
class Mythread(threading.Thread):
  def __init__(self):
  threading.Thread.__init__(self)
  

  def run(self):
  global n
  if lock.acquire():  # 将线程加锁
  print("Thread: ", n)
  n += 1
  lock.release()   # 释放锁
  

  
n = 0
  
t = []
  
lock = threading.Lock()   # 创建锁对象
  
for i in range(10):
  my = Mythread()
  t.append(my)
  

  
for i in range(10):
  t.start()
  

  
for i in range(10):
  t.join()
  

  意见简单的多线程扫描TCP端口的实例
  代码如下:
  

from socket import *  
import sys
  
import time
  
import threading
  

  
def scan(h, p):
  try:
  tcpCliSock = socket(AF_INET, SOCK_STREAM)
  tcpCliSock.connect((h, p))
  if lock.acquire():
  print(str("{} -> opened".format(p)))
  lock.release()
  except error:
  if lock.acquire():
  print(str("{} -> not open".format(p)))
  lock.release()
  

  finally:
  tcpCliSock.close()
  del tcpCliSock
  

  
posts = [21, 23, 25, 53, 69, 80, 135, 137, 139, 1521, 1433, 3306, 3389]
  
HOST = sys.argv[1]
  
lock = threading.Lock()
  
mt = []
  

  
start_time = time.time()
  

  
for p in posts:
  t = threading.Thread(target=scan, args=(HOST, p))
  mt.append(t)
  

  
for i in range(len(posts)):
  mt.start()
  

  
for i in range(len(posts)):
  mt.join()
  
print("end_time: {}".format(time.time() - start_time))
  

  结果如下:
  

F:\script\20180202>python scanner.py 192.168.1.1  
137 -> not open
  
135 -> opened
  
139 -> opened
  
3306 -> opened
  
53 -> not open
  
69 -> not open
  
1433 -> not open
  
80 -> not open
  
21 -> not open
  
1521 -> not open
  
3389 -> not open
  
23 -> not open
  
25 -> not open
  
end_time: 1.108708381652832

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-546740-1-1.html 上篇帖子: Nginx + uWSGI + Python + Django部署实例 下篇帖子: python学习前期(笔记)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表