首页 > 系统相关 >多进程操作和线程了解

多进程操作和线程了解

时间:2023-10-18 21:22:05浏览次数:38  
标签:__ task print 线程 import 进程 操作

今日内容详细

进程锁

"""锁在IT界都是非常重要的,不但在Python中出现,尤其是数据库中得锁更多,比如:表锁、行锁、悲观锁、乐观锁、进程锁、互斥锁、递归锁、可重入锁、死锁等"""

# 使用锁的目的就是为了保证安全!
import time
from multiprocessing import Process, Lock
def task(i, lock):
    # 上一把锁
    lock.acquire()
    print("进程%s来了" % i)
    time.sleep(1)
    print("进程%s走了" % i)
    # 释放锁
    lock.release()
    """只要你上了锁,一定别忘了最后释放锁,否则的话,别的进程永远进不来"""
    # 加锁一定好码? 虽然保证了数据的安全,但是呢,执行的效率一定是降低了
    # 有些场景该加锁的时候一定要加锁,

if __name__ == '__main__':
    lock=Lock()  # 得到一把锁
    for i in range(3):
        p = Process(target=task, args=(i+1, lock))
        p.start()

如何查看进程号

import time
import os
from multiprocessing import Process, Lock
"""有了进程号,我们就可以通过进程号来结束进程的执行   kill 9176 kill -9 9176"""
# taskkill /pid {pid}
def task():
    print("task进程的进程号:", os.getpid()) # os.getpid() 写在哪个进程里面就会输出哪个进程的进程号
    print("task进程的父进程的进程号:", os.getppid()) # parent process
    import time
    time.sleep(20)
if __name__ == '__main__':
    p=Process(target=task, )
    p.start()

    print('子进程的进程号:', p.pid)
    print("主进程的进程号", os.getpid())
    time.sleep(10)

进程之间数据隔离问题

n=100

def task():
    global n
    n=1
    print("子进程")


from multiprocessing import Process

"""这两个进程之间的数据有没有通信? 么有通信"""
if __name__ == '__main__':
    p = Process(target=task)
    p.start()
    """先让子进程先执行,让子进程去改值"""
    p.join()
    print("主进程中得值:", n)
    
"""问题是:如何让进程与进程之间数据通信? """

队列(Queue)

数据结构:链表、单链表、双链表、循环链表、栈、队列、树、二叉树、图

重点来看队列: 先进先出
栈的特点:先进后出
# 在python中如何使用队列
它给我们提供了一个内置的队列类

from multiprocessing import Queue


q=Queue(3)
## 入队:往队列里面添加数据

"""block=True, timeout=None"""
q.put('helloworld1')
q.put('helloworld2')
q.put('helloworld3')
# block=False: 如果往队列里面放数据放不进去的时候,会立马报错,报队列已满的错误信息
# q.put('helloworld4', block=False)

# timeout:超时的时间, 如果在指定的时间内,没有放进去,就会直接报错
# q.put('helloworld4',  timeout=3)

# q.put_nowait('helloworld4')


## 出队:从队列里面取出值
print(q.get())
print(q.get())
print(q.get())
# print(q.get(block=False))
# print(q.get(timeout=3))
# print(q.get_nowait())
print(q.qsize())
print(q.empty())
print(q.full())

"""现在队列里面的数据在哪里存着? 在内存中存着的"""
# 专业的消息队列:kafka, rabbitmq等专业的消息队列 他们能够解决一些特殊场景的问题

生产者消费者模型(重要)

"""在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题"""
该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度

为什么要使用生产者和消费者模式?


def producer(q, food):
    """先给我生产10个包子"""
    for i in range(10):
        q.put("生产的第%s个包子" % i)

def consumer(q):
    while True:
        res = q.get()
        print(res)
        if res is None:
            break


from multiprocessing import Process, Queue

if __name__ == '__main__':
    q = Queue(20)
    # 生产者
    p1 = Process(target=producer, args=(q,'包子'))

    p1.start()
 
    # 消费者
    c1 = Process(target=consumer, args=(q,))
 
    c1.start()
 
    """None放在这里是不行的,就想放在这里,你说怎么办?"""
    p1.join()
    p2.join()
    q.put(None)

线程

在一个进程中,线程就是必须存在的,至少要有一个线程来执行任务
一个进程中可以有多个线程,在一个进程中可有开启多个线程来执行任务
进程和线程都是有操作系统调度的
进程是操作系统分配资源的基本单位,线程是操作系统执行的最小单位

如何开启线程? 跟开进程是一样的
import time
def task(a, b):
    print("from task")
    time.sleep(2)
    print("aaa")


from  multiprocessing import Process
from threading import Thread
import threading
if __name__ == '__main__':
    # p=Process(target=task)
    # p.start()
    # deamon
    """开线程的资源非常小,以至于代码走到这一行就立马开起来了,所以就会立刻执行"""
    t=Thread(target=task, name='Thread-2', args=('a', ), kwargs={'b':1})
    # t.setDaemon(True)
    """设置为了守护进程:主进程结束,子进程跟着结束"""
    t.daemon = True # 把该线程设置为守护线程, 主线程执行完毕,子线程也结束
    """守护线程有什么用?"""
    t.start()
    # t.join()
    # print(t.name)
    """一个进程中如果只有一个线程,该线程称之为是主线程,其他线程称之为是子线程"""
    t.is_alive()
    print(t.getName()) # t.name
    t.setName('aaaa')
    # t.name = 'aaa'
    print("主线程")
    print(threading.currentThread())
    print(threading.enumerate())
    print(threading.activeCount())

标签:__,task,print,线程,import,进程,操作
From: https://www.cnblogs.com/zhangfanshixiaobai/p/17773365.html

相关文章

  • C# 对文件操作
    参考使用C#写入文件C#读取和写入文本文件C#读写txt文件的两种方法介绍在线编译器在线练习题相关类StreamReader类StreamReader类是从抽象基类TextReader继承,它也是一个读取系列字符的读取器。下表介绍了StreamReader类的一些常用方法:序号方法描述1public......
  • 在JavaScript中,`!!`(不是not)操作符的作用是什么?
    内容来自DOChttps://q.houxu6.top/?s=在JavaScript中,!!(不是not)操作符的作用是什么?我看到了一些代码,似乎使用了我不知道的操作符,形式为两个感叹号,就像这样:!!。有人能告诉我这个操作符是做什么的吗?我看到这个操作符的上下文是:this.vertical=vertical!==undefined?!!ver......
  • Linux查看进程的CPU和内存使用情况
    ps-aux|grep"spring-native-hello"结果:chkusr106110.00.0131313253364pts/1Sl19:560:00./spring-native-hellochkusr131920.00.0112812972pts/1S+20:040:00grep--color=autospring-native-hello每列的含义:USER:这一......
  • Learn Git in 30 days—— 第 30 天:分享工作中几个好用的 Git 操作技巧
    写的非常好的一个Git系列文章,强烈推荐原文链接:https://github.com/doggy8088/Learn-Git-in-30-days/tree/master/zh-cn 终于来到了最后一天,这篇文章将分享几个好用的Git操作技巧,或许可以节省你不少Git版控过程的时间。如何让gitpull/push/fetch不用输入账号、密......
  • Linux线程
    task_struct是用来描述进程的,它里面有一个指针指向mm_struct(虚拟地址空间)在地址空间中,栈区可以可以由ebp,esp来进行限定它的区域,那么堆区怎么来确定呢?怎么知道每次开辟的空间是多大范围的呢?这里还有一个结构来描述每次开辟堆区的大小——vm_area_struct,该结构的start,end就可以确定堆......
  • 进程信号
    信号什么是信号用户或者操作系统通过发送一定的信号,通知进程,让进程做出相应的处理,这就是信号进程要处理信号,必须要具有识别他的能力信号产生之后,进程可以找个时间进行处理,不需要立即进行处理——那么此时我们就要记录下来这个信号——记录这个信号我们可以用位图结构常见的信号:1到3......
  • Linux进程间通信
    因为进程间具有独立性,你们想用进行进程间通信,难度还是比较大的。进程间通信的本质就是让不同的进程看到同一份资源。为什么要进行进程间通信——交互数据、控制、通知等目标进程间通信的技术背景进程是具有独立性的。虚拟地址空间+页表保证进程运行的独立性(进程内核数据结构+进程......
  • redis其它操作,
    1redis其它操作......
  • 多线程
    #include<stdio.h>#include<pthread.h>#include<Windows.h>staticintg_num=0;staticintg_c=0;pthread_mutex_tgMutex_num=PTHREAD_MUTEX_INITIALIZER;pthread_mutex_tgMutex_c=PTHREAD_MUTEX_INITIALIZER;void*test(void*para)......
  • MySQL主从复制无法同步删除操作吗?【转】
    简介在MySQL主从复制中,当主库执行删除操作时,从库并不会同步删除对应的数据。这是由于MySQL的复制机制决定的。为了解决这个问题,我们可以通过在主库上创建触发器来实现删除操作的同步。解决方案概览下面是解决方案的整体流程图: 创建触发器首先,我们需要在主库上创建一个触发......