python的多线程和多进程网络编程

来源:互联网 发布:w7无法安装软件 编辑:程序博客网 时间:2024/06/05 02:51

二十八、python的多线程和多进程网络编程

线程和进程关系:

进程是具有独立功能的程序,进程是系统进行资源分配和调度的一个独立单位

线程是进程的一个实体,是cpu调度的基本单位,它是比进程更小的能独立运行的基本单位

 

国家是系统,企业是进程,个人是线程。

 

进程和线程:

进程有独立的地址空间,一个进程崩溃后,不会对其它进程产生影响(windows有点烂linux不会)

线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉。所以单进程的程序比多线程的程序健壮。

 

 

GIL和多线程:

Globle Interpreter Lock

CPU密集型

IO密集型


Python的多线程:

1Thread模块:偏底层

2Threading模块:偏高层

3、继承threading.Thread,实现run()方法

-join() : 挂起当前线程,直到被调用线程结束

-start():启动线程,执行run中的代码

-is.active():线程是否结束

 

线程中的锁:

threading.Lock

threading.Rock

Acquire(): 申请锁

Release():释放锁

 

代码1

class A(threading.Thread):

    def run(self):

        while True:

            print 'in thread'  #多个输出在一行可证明print为非原子操作

            time.sleep(1)

 

if __name__ == "__main__":

    mt = [A() for i in range(4)]

    for t in mt:

        t.start()

    for t in mt:

        t.join()

 

代码二:

class A(threading.Thread):

    def __init__(self, n):

        threading.Thread.__init__(self)  #必须要调用父类的这个方法,否则实例化失败

        self._n = n

 

    def run(self):

        while True:

            print 'in thread %s' % self._n  #可以看到In threading是那个线程打印的

            time.sleep(1)

 

if __name__ == "__main__":

    mt = [A(i) for i in range(4)]

    for t in mt:

        t.start()

    for t in mt:

        t.join()

 

代码三:

from faker import Factory

faker = Factory.create()

cnt = 10000

x1 = [faker.paragraph() for i in range(cnt)]

x2 = [faker.paragraph() for i in range(cnt)]

 

import time

#1、单线程

start=time.clock()

for one in x1:

    len(one)

for one in x2:

    len(one)

end = time.clock()

print 'single thread is %s ' % (end-start)

 

代码三:

#2、多线程,线程多反而慢咯??cpu密集型的任务,py的多线程反而会适得其反。并没有磁盘i/o和网络i/o

 

import threading

class A(threading.Thread):

    def __init__(self, x):

        threading.Thread.__init__(self)

        self.x = x

    def run(self):

        for each in self.x:

            len(each)

 

t1 = A(x1)

t2 = A(x2)

start1 = time.clock()

t1.start()

t2.start()

t1.join()

t2.join()

end1 = time.clock()

print 'two thread is %s ' % (end1-start1)

print (end1-start1)/(end-start)



Python的多进程:

1、多个python进程=多个GIL

2Multiprocessing模块

3、继承multiprocessing.Process,实现run()方法

-join(): 挂起当前进程,直到被调用进程结束

-start(): 启动进程,执行run中的代码

 

代码1

import multiprocessing

import time

 

#1、多进程,运行后可以去任务列表中看到5python.exe进程。为啥是5个?脚本一个,脚本里面启动4

class A(multiprocessing.Process):

    def __init__(self, n):

        multiprocessing.Process.__init__(self)  #必须要调用父类的这个方法,否则实例化失败

        self._n = n

 

    def run(self):

        while True:

            print 'in thread %s' % self._n  #可以看到In threading是那个线程打印的

            time.sleep(1)

 

if __name__ == "__main__":

    mt = [A(i) for i in range(4)]

    for t in mt:

        t.start()

    for t in mt:

        t.join()

 

 

进程间通信:

1、进程的内存空间是相互独立的

2、通过multiprocessing.Queue实现通信

3Queue.put()

4Queue.get()

 

代码二:

##模拟进程之间的消息通信,生产者和消费者模式。python的多进程容易吧,同样的功能,比javac++容易多咯

import multiprocessing

import time

 

class Producer(multiprocessing.Process):

   def __init__(self, q):

       multiprocessing.Process.__init__(self)  #必须先实例化父类

       self._q = q

 

   def run(self):

        while True:

            self._q.put('time is %s' % time.time()) #往生产者队列中放时间

            time.sleep(1)

 

class Consumer(multiprocessing.Process):

    def __init__(self, q, n):  #q:队列,n:消费者进程编号

        multiprocessing.Process.__init__(self)

        self._q = q

        self._n = n

    def run(self):

        while True:

            msg = None

            try:

                msg = self._q.get()  #从队列中取东西容易抛错

            except :

                time.sleep(1)

                continue

            if msg:

                print 'in consumer %s %s' % (self._n, msg)

 

if __name__ == "__main__":

    q = multiprocessing.Queue() #获取一个队列

    producer = Producer(q) #实例一个生产者

    c1 = Consumer(q, 1) #获取一个消费者实例

    c2 = Consumer(q, 2) #获取一个消费者实例

    producer.start() #将生产者启动

    c1.start() #将消费者启动

    c2.start() #将消费者启动


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 高危型hpv阳性52怎么办 腰椎盘突出腿疼怎么办 腰椎间盘突出压迫神经怎么办 疣体长到宫颈了怎么办 龟头的系带断了怎么办 龟头与系带断了怎么办 舌头下长肉芽痛怎么办 脑组织供血不足怎么办 尖锐湿锐喝酒了怎么办 快递寄错地方了怎么办 16岁掉头发严重怎么办 18岁老是掉头发怎么办 17岁头发老是掉怎么办 19岁老是掉头发怎么办 植发的了毛囊炎怎么办 长得好看不上镜怎么办 鬓角的头发总翘怎么办 戴贞洁锁硬了怎么办 欠很多钱还不了怎么办 理财平台跑路了怎么办 联通4g信号不好怎么办 老年人耳朵嗡嗡响什么原因怎么办 单侧耳朵嗡嗡响怎么办 蚊子钻到耳朵里怎么办 小飞虫进耳朵里怎么办 耳朵里飞进去虫怎么办 耳朵里进虫子了怎么办 耳朵进虫子了怎么办啊 耳朵里进了蚊子怎么办 有虫子爬进耳朵怎么办 虫子死在耳朵里怎么办 早上起床口苦口臭怎么办 耳朵被耳屎堵了怎么办 油耳朵被堵住了怎么办 棉签掏耳朵堵了怎么办 耳朵被气堵住了怎么办 掏耳朵发炎了疼怎么办 掏耳朵掏深了疼怎么办 耳朵里进了虫子怎么办? 耳朵里飞进小虫怎么办 一只耳朵听力差怎么办