10 2018 档案
摘要:#!/usr/bin/python # -*- coding:utf8 -*- import os allFileNum = 0 def printPath(level, path): global allFileNum ''''' 打印一个目录下的所有文件夹和文件 ''' # 所有文件夹,第一个字段是次目录的级别 ...
阅读全文
摘要:队列:队列是先进先出。 import queue q = queue.Queue() q.put(1) q.put(2) q.put(3) q.put(4) print(q.get()) print(q.get()) print(q.get()) print(q.get()) 当队列为空时,使用ge
阅读全文
摘要:定时器的作用就是多少秒之后开启一个线程。 注意这里的Timer是异步的。
阅读全文
摘要:条件Condition相当于给锁造钥匙,但是这钥匙是一次性的。一个线程拿到钥匙进去,出来之后钥匙没有归还,而是没了。 如下代码: 条件在创建之初,状态是False。 里面有四个命令: wait() 当状态是False的时候,程序阻塞。等钥匙。 notify(num) 造钥匙,num一定要是int类型
阅读全文
摘要:线程和进程一样也有信号量,一个资源在同一时刻只有规定数量的线程能使用。
阅读全文
摘要:死锁 说到死锁,可以讲一个科学家吃面的问题: 有几个科学家在一张桌子旁,桌子上只有一把筷子和一碗面,我们将面和筷子都加锁。这是可能会导致一个科学家抢到面,另一个科学家抢到筷子,这是就全部阻塞了,这就是死锁了。 如下代码: 打印结果: 看到小红拿到了面条,而小兰拿到了筷子,他们都需要对方拿到的资源来完
阅读全文
摘要:这段代码结果我们知道,因为GIL的原因,结果是0 再看如下代码: 打印结果却是9 为什么呢? 因为在0.1秒之内,所有线程肯定都进来了,但是需要睡0.1秒,这就是阻塞状态,他们会把手里的数据让给其他线程,所以每个线程的temp都是10,阻塞结束,10减1全变成9都写入内存,最终n的值就是9了,这样就
阅读全文
摘要:如下代码: 结果是:先打印 主线程结束,等十秒之后打印1 如下代码,加入守护线程: 结果是,只打印了 主线程结果,没打印子线程结果,也没等10秒,直接结束。 所以守护线程是随着主线程的结束而结束。 再看一个现象: 结果是,先打印 主线程结束,等3秒之后打印 子线程2 4 然后没有等待子线程1就直接结
阅读全文
摘要:import threading import time def func(n): time.sleep(0.5) n += 1 print(n, threading.current_thread(), threading.get_ident()) for i in range(10): threading.Thread(target=func, args...
阅读全文
摘要:我们使用高并发,一次是创建1万个线程去修改一个数并打印结果看现象: 我们可以看到,虽然是高并发,但是没有一条数据是重复的,为什么?因为Python解释器里面有全局解释器锁GIL,会让解释器每一时刻只有一个线程在运行,这样就保证了数据的安全了。 从这里我们也看出了,因为有全局解释器锁的存在就导致代码的
阅读全文
摘要:创建一个线程: 创建多线程: 一个进程中的线程数据是共享的: 另一种情况: 看到结果都变成一样的了,因为每个线程都将n的值变一次,不管变几次,n最终只有一个值,所在在0.1秒之后在输出n,都输出n的值了,就变成一样的了。 这种情况就会导致数据不安全,因为我不想要同一个输出结果,我想每个线程更改数据都
阅读全文
摘要:为什么有进程? 原来操作系统只能处理一件任务,有了进程就可以让操作系统处理多个任务。因为进程与进程之间是完全隔离的,涉及到了内存空间、数据的切换,所以就有了进程的概念。 已经有了进程,为什么还要线程? 线程有以下缺陷: 1,线程在同一时间只能干同一件事儿。 2,线程在执行任务的过程遇到阻塞,比如对等
阅读全文
摘要:如下代码: 结果是 in func1 这是通过回调函数就可以执行func2了: 打印结果: 这回调函数的作用就是将函数func1的返回值传给func2,并执行func2函数,所以不能在pool.apply_async里面单独给func2传值,func2接受的参数就是func1的返回值。 判断func
阅读全文
摘要:进程池的同步,如下程序: 查看结果: 可以发现,变成了进程变成了同步得了,运行特别慢。 apply方法的作用就是将进程池的进程变成同步的。 将进程池变成异步的,使用apply_async就可以了,如下: 但是发现结果什么都没有,因为主进程没有等子进程的结束就执行完了。 如下优化,使用join就行了:
阅读全文
摘要:为什么会有进程池的概念? 当我们开启50个进程让他们都将100这个数减1次减到50,你会发现特别慢! 效率问题,原因: 1,开辟内存空间。因为每开启一个进程,都会开启一个属于这个进程池的内存空间,因为进程与进程之间数据是完全隔离的。 2,并且这些独立的内存空间会有许多寄存器,堆栈,文件等,他们存着这
阅读全文
摘要:将数据设置成共享数据,一个进程修改了数据,另外一个进程就能就接受的被修改的数据。 起50个进程让他们都去操作一个数据: 多运行几次发现,结果有时是50,有时是53,有时是57等等。。。 为什么会出现这个结果,因为一个88被一个进程拿到要去修改还没修改时被其他进程拿到,然后这个进程将数据修改成87并写
阅读全文
摘要:管道是双向通信的,数据从其中一端传入,就会从另外一端传出。 在进程间通过管道实现通信。 多次发数据: 另一种方式close():
阅读全文
摘要:队列是先进先出。 进程间通信: 这样就实现了子进程与主进程,子进程与子进程之间的通信了。
阅读全文
摘要:信号量可以控制一个或多个进程同时进行阻塞或执行。 一个事件被创建后,默认是阻塞状态。
阅读全文
摘要:信号量概念和锁其实是一样的。 假如一个资源(就是一段代码),我们不想让所有进程同时使用,只想让规定的几个进程同时使用。这是就相当于一间上锁的房子,门后有4把钥匙,哪个进程拿到钥匙开锁才能进门,拿不到要是的进程就等着进去的进程出来还钥匙。这就是信号量的概念。 信号量:一段代码,同一时间只能被N个进程使
阅读全文
摘要:例1: 10个人去买票,先去查询余票,有票就去购买。代码如下: 解决办法:加锁 好比一个上锁的房间,门口只有一个钥匙,一个线程拿到钥匙进去修改数据没出来前,其他进程只能等着。 这样会出现有几张票就只有几个人能买票了,数据就安全了。
阅读全文
摘要:注册一个进程: from multiprocessing import Process import os def func(args): # 在子进程里面。args接收一个参数,如果要接受多个参数使用*args print(args) print(111) print('子进程:', os.get
阅读全文
摘要:什么是进程?什么是线程? 进程是系统中正在运行的一个程序,程序一旦运行就是进程。 进程可以看成程序执行的一个实例。进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要使用进程间通信,比如管道,文件,套接字等
阅读全文
摘要:git init 初始化 git status 查看状态 红色 未被托管 绿色 没完全托管 白色 被托管 git add 文件名 托管文件 git config --global user.email"111@qq.com" git config --global user.name"aaronth
阅读全文