线程

进程间通信

from multiprocessing import Queue
q = Queue(5)  # 括号内传的参数表示的是这个队列最大存存储数
q.put(1)  #往队列里添加数据
q.put(2)
print(q.full())  # 判断队列是否满了
q.put(3)
q.put(4)
q.put(5)
print(q.full())
# q.put(6) # 当队列满了,在放入数据不会报错,会原地等待,直到队列中的数据被取出
print(q.get())  # 从对列中取数据
print(q.get())
print(q.get())
print(q.empty())  # 判断数据队列是否取完
print(q.get())
print(q.get())
print(q.empty())
print(q.get_nowait())  #取值,如果没有直接报错
# print(q.get())  # 当队列中没有数据,程序阻塞,直到队列中有数据

进程间通信IPC机制

from multiprocessing import Process,Queue
def producer(q):
    q.put('hello')
def consumer(q):
    print(q.get())
if __name__ == '__main__':
    q = Queue()
    p = Process(target=producer,args=(q,))
    p1 = Process(target=consumer,args=(q,))
    p.start()
    p1.start()

生产者消费者模型

JoinableQueue 能够被join的q, q.task_done() 告诉队列数据被取出 q.join() 等待队列数据完全被取完

from multiprocessing import Process,JoinableQueue
import random
import time
def producer(name,food,q):
    for i in range(10):
        data = '%s生产了%s%s'%(name,food,i)
        time.sleep(random.random())
        q.put(data)
        print(data)
def consumer(name,q):
    while True:
        data = q.get()
        print('%s吃了%s'%(name,data))
        time.sleep(random.random())
        q.task_done()   #告诉队列从中取出一个数据,并且处理完毕了
if __name__ == '__main__':
    q = JoinableQueue()
    p = Process(target=producer,args=('egon','馒头',q))
    p1 = Process(target=producer,args=('tank','生蚝',q))
    p2 = Process(target=consumer,args=('jason',q))
    p3 = Process(target=consumer,args=('alex',q))
    p.start()
    p1.start()
    p2.daemon = True
    p3.daemon = True
    p2.start()
    p3.start()
    p.join()
    p1.join()
    q.join()   # 等到队列中数据全部取出

什么是线程
进程线程其实都是虚拟单位,都是用来帮助我们形象的描述某种事物

进程:资源单位
线程:执行单位

将内存比如成工厂 那么进程就相当于是工厂里面的车间 而你的线程就相当于是车间里面的流水线
ps:每个进程都自带一个线程,线程才是真正的执行单位,进程只是在线程运行过程中
提供代码运行所需要的资源

为什么要有线程
开进程
1.申请内存空间 耗资源
2."拷贝代码" 耗资源

开线程
一个进程内可以起多个线程,并且线程与线程之间数据是共享的
ps:开启线程的开销要远远小于开启进程的开销

创建线程的两种方式

方式一
from threading import Thread
import time
def tast(name):
    print('%s'%name)
    time.sleep(1)
    print('gun')
t = Thread(target=tast,args=('egon',))  # 开线程不需要在__main__代码块内 但是习惯性的还是写在__main__代码块内
t.start()  # 告诉操作系统开辟一个线程  线程的开销远远小于进程,小的代码执行完 线程就已经开启了
print('hi')

方式二
from threading import Thread
import time
class MyThread(Thread):
    def __init__(self,name):
        super().__init__()
        self.name = name
    def run(self):
        print('%s'%self.name)
        time.sleep(1)
        print('gun')
t = MyThread('egon')
t.start()
print('hi')

线程对象及其它方法

from threading import Thread,current_thread,active_count
import  time
import os
def test(name,i):
    print('%s'%name)
    print('子',current_thread().name)
    print('子',os.getpid())
    time.sleep(i)
    print('hi')
t = Thread(target=test,args=('egon',1))
t1 = Thread(target=test,args=('tank',2))
t.start()
t1.start()
t.join()
print('进程数',active_count())
print('主')
print('主',current_thread().name)
print('主',os.getpid())

守护线程

from threading import Thread,current_thread
import time
def test(i):
    print(current_thread().name)
    time.sleep(i)
    print('gg')
for i in range(3):
    t = Thread(target=test,args=('i'),)
    t.daemon = True
    t.start()
    print('主')

线程间通信

from threading import Thread
money = 100
def test():
    global money
    money = 999
t = Thread(target=test)
t.start()
t.join()
print(money)

互斥锁

from threading import Thread,Lock
import time
n = 100
def test(mutex):
    global n<br></br>   tmp = n
    mutex.acquire()
    n = tmp - 1
    mutex.release()
mutex = Lock()
l_list = []
for i in range(10):
    t = Thread(target=test,args=(mutex,))
    t.start()
    l_list.append(t)
for t in l_list:
    t.join()
print(n)
 

声明:该文章系转载,转载该文章的目的在于更广泛的传递信息,并不代表本网站赞同其观点,文章内容仅供参考。

本站是一个个人学习和交流平台,网站上部分文章为网站管理员和网友从相关媒体转载而来,并不用于任何商业目的,内容为作者个人观点, 并不代表本网站赞同其观点和对其真实性负责。

我们已经尽可能的对作者和来源进行了通告,但是可能由于能力有限或疏忽,导致作者和来源有误,亦可能您并不期望您的作品在我们的网站上发布。我们为这些问题向您致歉,如果您在我站上发现此类问题,请及时联系我们,我们将根据您的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。