python学习(三十二)线程锁&守护线程&多进程

1、线程锁

如果多个线程同时要修改一个数据的时候,可能会把数据覆盖,这个时候就要在改数据的时候加锁,只同时有一个线程在改这个数据,改完后再解锁。

在Python2里面要加锁,在Python3里面不用,因为Python3里面会自动加锁和解锁。

在Python2里面加锁的代码如下:

import threading,time
num=1
lock=threading.Lock() #申请一把锁
def run():
    time.sleep(1)
    global num
    lock.acquire()  #加锁
    num+=1
    lock.release()   #解锁   #在python3里面可以不加,默认会加上的
ts=[]
for  i in range(50):
    t=threading.Thread(target=run)
    t.start()
    ts.append(t)
[t.join() for t in ts]
#如果主线程没有做等待(以上两句),那么最后打印的num值是1,因为打印num的时候,子线程因有sleep时间还没执行完
print(num)

2、守护线程

把子线程设置为守护线程,那么主线程一旦结束,子线程不管有没有执行完也会结束

import threading,time
def run():
    time.sleep(3)
    print(‘hhh‘)

for i in range(50):
    t=threading.Thread(target=run)
    t.setDaemon(True)  #把子线程设置成为守护线程
    t.start()
print(‘运行完成‘)  #主线程执行完了,子线程也就结束了,所以只会打印这一句

以上代码,本来在3秒后要输出hhh,结果因为主线程运行完后,还没到3秒,hhh还没打印,子线程也结束了,所以只输出运行完成

如果以上代码主线程在输出运行完成后,等待3秒,那么子线程就可以执行

import threading,time
def run():
    time.sleep(3)
    print(‘hhh‘)

for i in range(50):
    t=threading.Thread(target=run)
    t.setDaemon(True)  #把子线程设置成为守护线程
    t.start()
print(‘运行完成‘)  #主线程执行完了,子线程也就结束了,所以只会打印这一句
time.sleep(3)  #因为主线程在打印上一句后,等待了3秒,这时候子线程运行完了,所以子线程的内容也会打印

3、多进程

多进程多用于处理CPU密集型任务

多线程多用于处理I/O密集型任务

import multiprocessing,threading
def my():
    print(‘哈哈哈哈‘)
def run(num):
    for i in range(num):
        t=threading.Thread(target=my)
        t.start()
if __name__==‘__main__‘:
    for i in range(5):
        p=multiprocessing.Process(target=run,args=(6,)) #启动进程
        p.start()

启动进程,每个进程有6个线程,总共5个进程,最后输出30次哈哈哈哈

原文地址:https://www.cnblogs.com/emilyliu/p/9112471.html

时间: 2024-10-07 17:35:50

python学习(三十二)线程锁&守护线程&多进程的相关文章

python学习[第十二篇] 数据类型之 集合

python学习[第十二篇] 数据类型之 集合 集合概念 python中集合是一组无序排列的哈希值.集合分为两种可变集合(set)和不可变集合(frozenset) 对可变集合可以修改和删除元素,对于不可变集合不允许.可变集合是不可以哈希的,因此既不能用作字典的键,也不能做其他集合的元素. 集合的增删改查 集合的创建于赋值 集合与列表([]) 和字典({})不同,集合没有特别的语法格式.列表和字典可以通过他们自己的工厂方法创建,这也是集合的唯一的创建方式.set()和frozenset() #创

Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息

之前的例子都是我们在子线程(WorkerThread)当中处理并发送消息,然后在主线程(UI线程)中获取消息并修改UI,那么可以不可以在由主线程发送消息,子线程接收呢?我们按照之前的思路写一下代码: package cn.lixyz.handlertest; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import andr

python学习三十天(错误处理)

今日内容: 1.昨日作业 2.错误处理 一,昨日作业 题目:三级菜单使用递归和栈的方式写 递归方式 字典: university_list = { "安徽省": { "合肥": ["中国科技大学", "合肥工业大学"], "安庆": ["安庆学院"], "阜阳": ["阜阳学院"] }, "江苏省": { "南京&qu

python 学习三十五天(socket的更多方法)

1.黏包 2.socket的更多方法介绍 3.验证客户端连接合法性 4.socketserver模块 一.黏包 1.现象: res=subprocess.Popen(cmd.decode('utf-8'), shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE) 的结果的编码是以当前所在的系统为准的,如果是windows,那么res.stdout.read()读出的就是GBK编码的,在接收端需要用GBK解码 且只能从管道里读一次结果

Python学习(十二)—— 常见模块

常见内置模块 time模块 时间戳(单位是秒,代表由1970年元旦凌晨至今过去的时间),常用于计算 .time(): 1 import time 2 #时间戳,单位是s 3 print(time.time()) 4 # 1583246063.46606 结构化时间 (显示当地当前的精确时间 年月日...).localtime() 1 print(time.localtime()) 2 # time.struct_time(tm_year=2020, tm_mon=3, tm_mday=3, tm

Hadoop学习三十二:Win7下无法提交MapReduce Job到集群环境

一. 对hadoop eclipse plugin认识不足 http://zy19982004.iteye.com/blog/2024467曾经说到我最hadoop eclipse plugin作用的认识.但事实上我犯了一个错误,Win7 Eclipse里的MyWordCount程序一直在本地运行,没有提交到集群环境上运行(查看192.168.1.200:50030)没有这个Job.运行方式分为两种,右键Run As Java Application Run on Hadoop 如果说Run A

python学习第十二课

memcache 介绍 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. emcached缺乏认证以及安全管制,这代表应该将memcached服务器放置在防火墙后. 由于Redis只使用单核,而

python 学习第十二课

memcache 介绍 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. emcached缺乏认证以及安全管制,这代表应该将memcached服务器放置在防火墙后. 由于Redis只使用单核,而

python学习笔记(十二) - 常用内建模块

一.collections 1. namedtuple namedtuple是一个函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素. from collections import namedtuple Point = namedtuple('Point', ['x', 'y']) p = Point(1, 2) print p.x print p.y 2.deque deque是为了实现高效插入和高效删除操作的双向列表