python——多线程与线程锁

摘要:
进程中,线程来工作,线程是最小的单位。python文件本身就是一个进程,所以在没有启动线程的时候,本身就有一个主线程。主线程等待子线程方法一:threads=[]:foriinrange:#启动10个线程sk=threading.Threadsk.start()threads.append#运行完的子线程,加入到list中fortinthreads:t.join()#等待list中子线程全部运行完,这里的join区别于字符串的join#t.join的作用就是,主线程一直等待全部的子线程结束之后,主线程自身才结束,程序退出。print#结果:10个线程需要2秒多点主线程等待子线程方法二:foriinrange:sk=threading.Threadsk.start()#threading.activeCount():#查看当前运行的线程数,包括主线程whilethreading.activeCount()!

一、概念:

进程:对系统过来说,一个任务是一个进程;

线程:线程是包含在进程中。进程中,线程来工作,线程是最小的单位。一个进程可以启多个线程

二、进程和线程使用时的选择:

1.cpu密集型任务,用进程 #比如排序、计算的功能
2.IO密集型任务,多线程 input Output #读写频繁,网络IO或者磁盘IO。浪费CPU比较少的用多线程
3.如果需要读写也需要计算,就用多进程+多线程

# print(os.cpu_count())        #查看电脑cpu有几个
#cpu是8核,就只能同时运行8个任务
#python中GIL,全局解释器锁,导致python得多线程利用不了多核CPU,但是多进程可以

三、多线程

import threading #引入多线程
importrequest,time,os

deflajifenlei():
    time.sleep(2):
    print('干垃圾')
start_time=time.time()

defshangke():
    time.sleep(2)
    print('上课')
#单线程
for  i in range(10):
    lajifenlei()
print(time.time()-start_time)
#结果:单线程需要20多秒
#启动线程
for i in range(10):#启动10个线程
    th=threading.Thread(target=laijifenlei)  #只写函数名
th.start()
print(time.time()-start_time)   #这里打印出的结果,是主线程运行完的时间,但是子线程并没有运行完。

线程和线程之间是独立的,所有的进程中,本身就有一个线程,这个线程是主线程。python文件本身就是一个进程,所以在没有启动线程的时候,本身就有一个主线程。

那么,如果需要知道所有线程运行完的时间,就需要主线程等待子线程。

主线程等待子线程方法一:

threads=[]:
for i in range(10):#启动10个线程
    sk=threading.Thread(target=shangke)
    sk.start()
    threads.append(sk)#运行完的子线程,加入到list中
for t inthreads:
    t.join() #等待list中子线程全部运行完,这里的join区别于字符串的join
#t.join的作用就是,主线程一直等待全部的子线程结束之后,主线程自身才结束,程序退出。
 print(time.time()-start_time) #结果:10个线程需要2秒多点

主线程等待子线程方法二:

for i in range(10):
    sk=threading.Thread(target=shangke)
    sk.start()
#threading.activeCount():#查看当前运行的线程数,包括主线程
while threading.activeCount()!=1:          #查看当前有几个线程,=1说明只有一个主线程,即子线程都运行完了。
     pass
print(time.time() - start_time)

四、线程锁:

多个线程同时操作一个数据的时候,就应该加锁

给线程加锁:

count=0
lock=threading.Lock()  #申请一把锁
deflajifenlei():
    globalcount
    lock.acquire()#加锁
    count+=1lock.release()#解锁。如果只加锁,不解锁,就是死锁。死锁得话,程序就会卡在这里无法继续运行
     print('干垃圾')
for i in range(10):
    jlj=threading.Thread(target-lajifenlei)
    jlj.start()
while threading.activeCount()!=1:
    pass
print(count)
print('finash')

免责声明:文章转载自《python——多线程与线程锁》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇离线地图方案 MaperitiveProcessBuilder执行本地命令下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

PyCharm不能debug问题

错误日志 控制台错误 Traceback (most recent call last): File "C:Program FilesJetBrainsPyCharm 2019.1.4helperspydevpydevd.py", line 15, in <module> from _pydevd_bundle.pydevd_con...

解析SQL Server之任务调度

  在前面两篇文章中( 浅谈SQL Server内部运行机制 and 浅谈SQL Server数据内部表现形式 ),我们交流了一些关于SQL Server的一些术语,SQL Sever引擎 与SSMS抽象模型,SQL Server内部存储机制和SQL Server内部体系结构等。讨论的这些问题,均可以归为一个问题,即"SQL Server是怎么执行客户端输...

2、python,for..in语句

for..in语句是循环语句,它迭代一个对象的序列,例如经历序列中的第一项。一个序列只是一个有序的项目的集合。 1 for i in range(1, 5): 2 print(i) 3 else: 4 print('for循环结束') 输出:1 2 3 4 for循环结束 它是如何工作的? 打印一个数字序列,我们使用内置的range函数生成...

java线程占多大的内存,占哪里的内存?

说到线程,我们往往想到的是线程安全、线程池,很少会去考虑线程的内存。 那么一个线程占用多大的内存?占用哪里的内存呢? 占多大的内存? jdk1.4默认的单个线程是占用256k的内存 jdk1.5+默认的单个线程是占用1M的内存 可以通过-Xss参数设定,一般默认就好 占哪里的内存? 这TM还用问?java线程当然是占用jvm的内存啊!(╯‵□′)╯︵┻━┻...

Protobuf 语法指南

英文: Proto Buffers Language Guide 本指南描述了怎样使用protocol buffer 语法来构造你的protocol buffer数据,包括.proto文件语法以及怎样生成.proto文件的数据访问类。(本文只针对proto2的语法) 本文是一个参考指南——如果要查看如何使用本文中描述的多个特性的循序渐进的例子,请在http...

Python3的threading模块 lock、Rlock的使用

Python3的threading模块 lock、Rlock的使用 一、概述 在使用多线程的应用下,如何保证线程安全,以及线程之间的同步,或者访问共享变量等问题是十分棘手的问题,也是使用多线程下面临的问题,如果处理不好,会带来较严重的后果,使用python多线程中提供Lock 、Rlock 、Semaphore 、Event 、Condition 用来保证...