python整理-day11

一、线程

  1、基本使用

    创建线程,两种方式

    第一种:

import threading
def f1(arg):
    print(arg)

t=threading.Thread(target=f1,args=(123,))
t.start()

结果:

123

    第二种:

import threading
class Myclass(threading.Thread):
    def __init__(self,func,args):
        self.func=func
        self.args=args
        super(Myclass,self).__init__()

    def run(self):
        self.func(self.args)

def f2(arg):
    print(arg)

obj=Myclass(f2,123)
obj.start()

结果:

123

第二种方法就是我们自己来创建已经类,然后调用threading.Thread这个父类,然后在使用super来进行调用

  2、生成者消费者模型(队列,但是和rabbitMQ不一样,这个是python自己的)

    队列:总共有四种队列,分别是先进先出队列,后进后出队列,优先级队列,双向队列

import queue

q=queue.Queue(2)

print(q.empty())

q.put(11)
q.put(22)

print(q.qsize())

print(q.get())
q.get()
q.task_done()
print(q.get())
q.get()
q.task_done()

#q.join()

结果:

True
2
11

这个就是普通的先进先出队列

put是放数据,是否阻塞,阻塞是的超时时间

get是取数据(默认阻塞),是否阻塞,阻塞时的超时时间

queue.Queue(2)队列最大长度

qsize()真实个数

maxsize最大支持的个数

join、task_done,阻塞进程,当队列中任务执行完毕以后,不再阻塞

import queue
q=queue.LifoQueue()
q.put(123)
q.put(345)
print(q.get())

q1=queue.PriorityQueue()
q1.put((1,"wzc1"))
q1.put((1,"wzc11"))
q1.put((1,"wzc1111"))
q1.put((1,"wzc111"))
q1.put((3,"wzc3"))
q1.put((2,"wzc4"))
print(q1.get())

q2=queue.deque()
q2.append(123)
q2.append(333)
q2.appendleft(456)
print(q2.pop())
print(q2.popleft())

结果:

345
(1, ‘wzc1‘)
333
456

后进后出队列==lifoqueue

优先级队列==priorityqueue

双向队列==deque

线程锁

lock和rlock的区别,一个是只支持单层锁,一个是支持多层锁

import threading
import time

NUM=10
def func(www):
    global NUM
    www.acquire()
    NUM-=1
    time.sleep(1)
    print(NUM)
    www.release()

lock=threading.Lock()

for i in range(10):
    t=threading.Thread(target=func,args=(lock,))
    t.start()

结果:

9
8
7
6
5
4
3
2
1
0
mport threading
def func(i,e):
    print(i)
    e.wait()#检测是什么信号
    print(i+100)

event=threading.Event()

for i in range(20):
    t=threading.Thread(target=func,args=(i,event,))
    t.start()

event.clear()#禁止信号
inp=input(">>>")
if inp == "1":
    event.set()#通行信号

结果:

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>>>1
103
102
106
107
108
109
112
113
115
118
101
104
110
114
117
100
116
105
119
111

另一种使用方法

import threading
def func(i,con):
    print(i)
    con.acquire()
    con.wait()
    print(i+100)
    con.release()

c=threading.Condition()

for i in range(20):
    t=threading.Thread(target=func,args=(i,c,))
    t.start()

while True:
    inp=input(">>>")
    if inp == "q":
        break
    c.acquire()
    c.notify(int(inp))
    c.release()

结果:

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>>>3
>>>101
100
102
2
>>>103
104
5
>>>105
108
106
109
107

二、进程

  1、基本使用

  

from multiprocessing import Process
from  multiprocessing import queues
import multiprocessing
import time
def foo(i,arg):
    arg.put(i)
    print("say HI ",i,arg.qsize())

li=queues.Queue(20,ctx=multiprocessing)
for i in range(10):
    p=Process(target=foo,args=(i,li,))

    p.start()

进程测试的时候不加 if __name__ == ‘__main__‘: Windows无法执行,但是linux和mac可以,加上了就可以执行了

  基本使用

    默认数据不共享

    queue

    array

    manager.dict

    pipe

  进程池

array:

from multiprocessing import Process
from  multiprocessing import Array
import multiprocessing
import time
def foo(i,arg):
    arg[i]=i+100
    for items in arg:
        print(items)
    print("========")

li=Array("i",10)
for i in range(10):
    p=Process(target=foo,args=(i,li,))
    p.start()

结果:

  

100
0
0
0
0
0
0
0
0
0
========
100
101
0
0
0
0
0
0
0
0
========
100
101
102
0
0
0
0
0
0
0
========
100
101
102
103
0
0
0
0
0
0
========
100
101
102
103
104
0
0
0
0
0
========
100
101
102
103
104
105
0
0
0
0
========
100
101
102
103
104
105
106
0
0
0
========
100
101
102
103
104
105
106
107
0
0
========
100
101
102
103
104
105
106
107
108
0
========
100
101
102
103
104
105
106
107
108
109
========

manager.dict

from multiprocessing import Process
from  multiprocessing import Manager
import multiprocessing
import time
def foo(i,arg):
    arg[i]=i+100
    print(arg.values())

obj=Manager()
li=obj.dict()
for i in range(10):
    p=Process(target=foo,args=(i,li,))
    p.start()
time.sleep(0.1)

结果:

[100]
[100, 101]
[100, 101, 102]
[100, 101, 102, 103]
[100, 101, 102, 103, 104]
[100, 101, 102, 103, 104, 105]
[100, 101, 102, 103, 104, 105, 106]
[100, 101, 102, 103, 104, 105, 106, 107]
[100, 101, 102, 103, 104, 105, 106, 107, 108, 109]
[100, 101, 102, 103, 104, 105, 106, 107, 108, 109]

进程池

pool.close()所有的任务执行完毕

pool.terminal()立即终止

from multiprocessing import Pool
import time

def f1(arg):
    time.sleep(1)
    print(arg)

pool=Pool(5)

for i in range(30):
    #pool.apply(func=f1,args=(i,))
    pool.apply_async(func=f1,args=(i,))

pool.close()
#time.sleep(1)
#pool.terminate()
pool.join()

结果:

0
1
2
3
4
5
6
7
8
9
11
10
12
13
14
16
15
17
18
19
21
22
20
23
24
25
27
26
28
29

三、协程

  1、什么时候使用协程

  2、greenlet

  3、gevent

greenlet:

from greenlet import greenlet

def test1():
    print(12)
    gr2.swith()
    print(34)
    gr2.swith()

def test2():
    print(56)
    gr1.swith()
    print(78)

gr1=greenlet(test1)
gr2=greenlet(test2)

gr1.swith()

gevent:

from gevent import monkey;monkey.patch.all()
import gevent
import requests

def f(url):
    print("GET : %s" % url)
    resp=requests.get(url)
    data=resp.text
    print("%d bytes received from %s" % (len(data),url))

gevent.joinall([
    gevent.spwan(f,‘https://www.baidu.con‘),
    gevent.spwan(f,‘https://www.yahoo.con‘),
    gevent.spwan(f,‘https://www.github.con‘)

])
时间: 2024-08-05 19:34:29

python整理-day11的相关文章

Python整理开发环境搭建

Python整理环境搭建,不仅仅包括Python版本的安装,还包括Python命令行,setuptools安装,和工作环境配置等. 1. Python版本的安装 Python的安装 >>> Window下的安装,配置挺简单,稍微注意点的是,PATH配置 >>> Linux 下的安装,大致遵循下面的安装顺序. 网上可以找到很多,Python的安装配置(Windows和Linux下): http://weixiaolu.iteye.com/blog/1617440 安装Mi

Python基础day-11[内置函数(未完),递归,匿名函数]

内置函数: abs() : 返回数字的绝对值.参数可以是整数或浮点数,如果参数是复数,则返回复数的模. print(abs(0.2)) print(abs(1)) print(abs(-4)) print(abs(-0.2)) print(abs(3+4j)) 执行结果: D:\Python\Python36-32\python.exe E:/Python/DAY-11/tmp.py 0.2 1 4 0.2 5.0 Process finished with exit code 0 all():

Python 整理一

---恢复内容开始--- Python (pailen)最近学习这个语言,其实早在几年前学习perl的时候就知道有这个语言了,在讲perl的那本书后面就推荐学习python,并且还附加了二章的入门.当时初看了一下,发现和perl很相似. 这几天学了python的一些基本东西,整理一下.如下 : #!/usr/bin/python ''' 3.XX版后,默认是UTF-8,支持中文了. ''' #coding=utf-8 '''这是注释,和Perl一样可以使用#号注释单行,但是多行注释是使用3个单引

python小白-day11 sqlalchemy

SqlAlchemy ORM SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果. Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如: MySQL-Python     mysql+mysqldb://<user>:<password>@<host>[:<po

python整理-day9

1.TCP/IP tcp/ip协议的英文全名:Transmission control protocol and internet protocol tcp/ip协议是主机接入互联网以及接入互联网的两台主机通信额标准 1.物理层(Physical Layer) 物理层规定了激活.维持.关闭通信端点之间的机械特性.电气特性.功能特性以及过程特性.该层为上层协议提供了一个传输数据的物理媒体. 在这一层,数据的单位称为比特(bit). 属于物理层定义的典型规范代表包括:EIA/TIA RS-232.E

python整理-day4

1.Python基础 2.基本数据类型:str,dict,list,int s="wzc" =>str 3.函数式编程 函数定义 内置函数 文件处理 注意: li=[11,22,33,44] def fi(arg): arg.append(55) fi(li) print(li) li=fi(li) print(li) 这里需要说明的是,函数默认返回的是None,所以我们在使用的时候需要通过参数引用 4.其他 三元运算 lambda表达式 s="哈哈" byt

python整理-Day3

set 无须,不重复,可嵌套的集合 1 class set(object): 2 """ 3 set() -> new empty set object 4 set(iterable) -> new set object 5 6 Build an unordered collection of unique elements. 7 """ 8 def add(self, *args, **kwargs): # real signatu

python整理-Day2

变量 写三种定义变量的方法 第一种,大家常用的多是这种 user='wzc' passwd='ww' 第二种 user1,passwd1='wzc1','www' 第三种 #三个单引号或者三个双引号 ww=''' sdsdsdsds:%s '''%(user) 需要注意一点,我们有的时候会使用拼接,但是这样会比不使用拼接所用的内存要多 这样一个就是使用了三块内存 常量 常量在定义的时候需要注意大写,方便大家识别 #常量一般都是使用大写 MYSQL_CONNECTION="192.168.1.1&

python整理-Day1

Python安装 1.下载安装包 https://www.python.org/downloads/ 2.安装 默认安装路径:C:\python27 3.配置环境变量 [右键计算机]-->[属性]-->[高级系统设置]-->[高级]-->[环境变量]-->[在第二个内容框中找到 变量名为Path 的一行,双击] --> [Python安装目录追加到变值值中,用 : 分割] 如:原来的值;C:\python27,切记前面有分号 4.在机器上安装pycharm,通过pych