发布于2020-02-10 17:29 阅读(1417) 评论(0) 点赞(7) 收藏(0)
进程和线程的关系:
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
(3)处理机分给线程,即真正在处理机上运行的是线程
(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。线程是指进程内的一个执行单元,也是进程内的可调度实体.
进程与线程的区别:
(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
使用线程可以把占据长时间的程序中的任务放到后台去处理。
用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。
程序的运行速度可能加快。
在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。
import threading
threading.Thread(target=None, name=None, args=())
target 是函数名字,需要调用的函数。
name 设置线程名字。
args 函数需要的参数,以元祖( tuple)的形式传入
Thread 对象主要方法说明:
run(): 用以表示线程活动的方法。
start():启动线程活动。
join(): 等待至线程中止。
isAlive(): 返回线程是否活动的。
getName(): 返回线程名。
setName(): 设置线程名。
import threading
import time, random, math
# idx 循环次数
def printNum(idx):
for num in range(idx):
# 打印当前运行的线程名字
print("{0}\tnum={1}".format(threading.current_thread().getName(), num))
# 随机生成一个数*2,向上取整使线程休眠,这里*2是为了时间间隔大一些
delay = math.ceil(random.random() * 2)
#进行休眠
time.sleep(delay)
if __name__ == '__main__':
#这里args()的值就是printNum函数的参数
th1 = threading.Thread(target=printNum, args=(2,), name="thread1")
th2 = threading.Thread(target=printNum, args=(3,), name="thread2")
# 启动2个线程
th1.start()
th2.start()
# 等待至线程中止
th1.join()
th2.join()
print("{0} 线程结束".format(threading.current_thread().getName()))
thread1 num=0
thread2 num=0
thread1 num=1
thread2 num=1
thread2 num=2
MainThread 线程结束
import threading
import time, random, math
#继承Thread类
class MutliThread(threading.Thread):
def __init__(self, threadName, num):
threading.Thread.__init__(self)
self.name = threadName
self.num = num
#重写run方法
def run(self):
for i in range(self.num):
print("{0} i={1}".format(threading.current_thread().getName(), i))
delay = math.ceil(random.random() * 2)
time.sleep(delay)
if __name__ == '__main__':
thr1 = MutliThread("thread1", 3)
thr2 = MutliThread("thread2", 2)
# 启动线程
thr1.start()
thr2.start()
# 等待至线程中止
thr1.join()
thr2.join()
print("{0} 线程结束".format(threading.current_thread().getName()))
thread1 i=0
thread2 i=0
thread1 i=1
thread2 i=1
thread1 i=2
MainThread 线程结束
import threading, time
def run(taskName):
print("任务:", taskName)
time.sleep(2)
print("{0} 任务执行完毕".format(taskName)) # 查看每个子线程
if __name__ == '__main__':
start_time = time.time()
for i in range(3):
thr = threading.Thread(target=run, args=("task-{0}".format(i),))
thr.start()
# 查看主线程和当前活动的所有线程数,active_count方法是查看当前线程数
print("{0}线程结束,当线程数量={1}".format(threading.current_thread().getName(), threading.active_count()))
print("消耗时间:", time.time() - start_time)
任务: task-0
任务: task-1
任务: task-2
MainThread线程结束,当线程数量=4
消耗时间: 0.0009751319885253906
task-2 任务执行完毕
task-0 任务执行完毕
task-1 任务执行完毕
import threading, time
def run(taskName):
print("任务:", taskName)
time.sleep(2)
print("{0} 任务执行完毕".format(taskName))
if __name__ == '__main__':
start_time = time.time()
for i in range(3):
thr = threading.Thread(target=run, args=("task-{0}".format(i),))
# 把子线程设置为守护线程,一定在启动线程前设置
thr.setDaemon(True)
thr.start()
# 查看主线程和当前活动的所有线程数
thrName = threading.current_thread().getName()
thrCount = threading.active_count()
print("{0}线程结束,当线程数量={1}".format(thrName, thrCount))
print("消耗时间:", time.time() - start_time)
任务: task-0
任务: task-1
任务: task-2
MainThread线程结束,当线程数量=4
消耗时间: 0.0010023117065429688
import threading
balance = 100
def change(num, counter):
global balance
for i in range(counter):
balance += num
balance -= num
if balance != 100:
# 如果输出这句话,说明线程不安全
print("balance=%d" % balance)
break
if __name__ == "__main__":
thr1 = threading.Thread(target=change, args=(100, 500000), name='t1')
thr2 = threading.Thread(target=change, args=(100, 500000), name='t2')
thr1.start()
thr2.start()
thr1.join()
thr2.join()
print("{0} 线程结束".format(threading.current_thread().getName()))
balance=200
MainThread 线程结束
#创建锁
mutex = threading.Lock()
#锁定
mutex.acquire([timeout])
#释放
mutex.release()
import threading
balance = 100
lock = threading.Lock()
def change(num, counter):
global balance
for i in range(counter):
# 先要获取锁
lock.acquire()
balance += num
balance -= num
# 释放锁
lock.release()
if balance != 100:
# 如果输出这句话,说明线程不安全
print("balance=%d" % balance)
break
if __name__ == "__main__":
thr1 = threading.Thread(target=change,args=(100,500000),name='t1')
thr2 = threading.Thread(target=change,args=(100,500000),name='t2')
thr1.start()
thr2.start()
thr1.join()
thr2.join()
print("{0} 线程结束".format(threading.current_thread().getName()))
MainThread 线程结束
作者:what
链接:https://www.pythonheidong.com/blog/article/231020/665add5c7415384ebe8d/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!