继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Python多线程编程实例

拉丁的传说
关注TA
已关注
手记 603
粉丝 126
获赞 789

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 threadingimport timedef 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() - time1print("intervall: ", interval)print("**** Multithreading")n = [1000, 1000]mythread = []time2 = time.time()# 将线程对象加入到一个列表中for i in range(len(n)):    t = threading.Thread(target=sum, args=(n[i],))    mythread.append(t)# 将列表中的线程对象循环启动for i in range(len(n)):    mythread[i].start()# 等待线程的结束for i in range(len(n)):    mythread[i].join()interval2 = time.time() - time2print("interval2: ", interval2)

返回结果如下:

**** Single Thread500500500500intervall:  2.490525245666504**** Multithreading500500500500interval2:  1.8753752708435059

多线程锁的操作

代码如下:

import threadingclass 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 = 0t = []lock = threading.Lock()   # 创建锁对象for i in range(10):    my = Mythread()    t.append(my)for i in range(10):    t[i].start()for i in range(10):    t[i].join()

意见简单的多线程扫描TCP端口的实例

代码如下:

from socket import *import sysimport timeimport threadingdef 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 tcpCliSockposts = [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[i].start()for i in range(len(posts)):    mt[i].join()print("end_time: {}".format(time.time() - start_time))

结果如下:

F:\script\20180202>python scanner.py 192.168.1.1137 -> not open135 -> opened139 -> opened3306 -> opened53 -> not open69 -> not open1433 -> not open80 -> not open21 -> not open1521 -> not open3389 -> not open23 -> not open25 -> not openend_time: 1.108708381652832

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP