python线程间通信的方式_android 线程间通信

python线程间通信的方式_android 线程间通信1、python多线程#!/usr/bin/evnpython3#–*–coding:utf-8–*–#该实例反编译来说明函数执行流程importdisdefadd(a):a=a+1returnaprint(dis.dis(add))#Python中一个线程对应于C语言中的一个线程(CPython而言)(Python并不一定…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

1、python多线程

#! /usr/bin/evn python3
# --*-- coding: utf-8 --*--

#该实例反编译来说明函数执行流程
import dis

def add(a):
    a = a+1
    return a

print(dis.dis(add))

# Python中一个线程对应于C语言中的一个线程(CPython而言)(Python并不一定就慢,视情况而定)
#pypy解释器专门克服gil慢的一种解释器(去gil化)
#GIL使用同一个时刻只有一个线程在一个cpu上执行字节码,无法将多个线程映射到多个CPU上
#gil锁会根据执行的字节码或时间片划分适当的释放(python内部实现机制)
#该实例来说明GIL在某种情况下会自动释放让下一个线程去执行(时间片来回切换)

#反编译(函数执行流程)同一时刻只有一个线程在CPU上执行
total = 0

def add():
    global total
    for i in range(1000000):
        total += 1

def desc():
    global total
    for j in range(1000000):
        total  -= 1
import threading
threading1 = threading.Thread(target = add)
threading2 = threading.Thread(target= desc)

threading1.start()
threading2.start()

threading1.join()
threading2.join()
print(total)

#对于io操作来说,多线程和多进程差别不大(用两种方法实现Python多线程编写)
#1、通过Thread类实例化(适用简单的或是线程池)

#以模拟简单的爬取文章列表页在获取详情页作一示例
import time
import threading

def get_detail_html(url):
    #爬取文章详情页
    print("get detail html started")
    time.sleep(2)
    print("get detail html end")

def get_detail_url(url):
    #爬取文章列表页
    print("get url started")
    time.sleep(4)
    print("get detail url end")


if __name__=="__main__":
    thread1 = threading.Thread(target=get_detail_html,args=("",)) #线程1
    thread2 = threading.Thread(target=get_detail_url,args=("",)) #线程2
    # thread1.setDaemon(True) #守护线程
    # thread2.setDaemon(True) #守护线程
    start_time = time.time()
    thread1.start()
    thread2.start()
    # thread1.join() #阻塞等待
    # thread2.join() #阻塞等待
    print("last time: {}".format(time.time()-start_time)) #主线程

#2、通过集成Thread来实现多线程
import threading
import time

class GetDetailHtml(threading.Thread):
    def __init__(self,name): #重写__init__方法
        super().__init__(name=name) #调用__init__方法

    def run(self):    #重写run方法,而非start方法
        print("get detail html")
        time.sleep(2)
        print("get html end")

class GetDetailUrl(threading.Thread):
    def __init__(self,name):   #重写__init__方法
        super().__init__(name=name) #调用__init__方法

    def run(self):   #重写run方法,而非start方法(在此可以编写逻辑复杂的程序)
        print("get detail url")
        time.sleep(4)
        print("get url end")

if __name__=="__main__":
    thread1 = GetDetailHtml("get_detail_html")
    thread2 = GetDetailUrl("get_detail_url")
    start_time = time.time()
    thread1.start()
    thread2.start()
    thread1.join() #阻塞等待回收
    thread2.join() ##阻塞等待回收
    #当主线程退出的时候,子线程kill掉
    print("last time: {}".format(time.time()-start_time))

2、线程间的通信方式–共享变量

#!/usr/bin/evn python3
# --*-- coding: utf-8 --*--

#线程之间的通信

# 1、线程间的通信方式--共享变量(不推荐)
# 如果是各种数据的时候,也可首选使用共享变量而非queue
#共享变量的操作并不是线程安全的操作,为了达到预期的效果必须在这些操作上加上一把锁,能够安照预期的效果在线程之间按照顺序进行同步
#多进程中共享变量是行不通的
#声明一个全局变量,将这个全局变量在各个线程中使用


#以模拟简单的爬取文章列表页在获取详情页作一示例
import time
import threading

#设置全局变量的方式
detail_url_list = [] #作用:获取文章的列表页并获取文章详情页的url

# (该列表(或全局或全局变量)可以定义在.py文件中,直接from  模块 import  xx (xx.py)--> xx.全局变量)
#from chaper11 import variables  不推荐:from chapter11.variables import detail_url_list
# detail_url_list = variables.detail_url_list

#这种方式是通过声明全局变量global的方式进行通信,非常原始并且不够灵活
def get_detail_html():
    #爬取文章详情页
    global detail_url_list
    while True:
        if len(detail_url_list):
            url = detail_url_list.pop()
            # for url in detail_url_list:
            print("get detail html started")
            time.sleep(2)
            print("get detail html end")

def get_detail_url():
    global detail_url_list
    while True:
        #爬取文章列表页
        print("get url started")
        time.sleep(2)
        for i in range(20):
            detail_url_list.append("http://projectstedu.com/{id}".format(id=i))
        print("get detail url end")



if __name__=="__main__":
    thread_detail_url = threading.Thread(target=get_detail_url) #线程1
    thread_detail_url.start()
    for i in range(10):
        html_thread = threading.Thread(target=get_detail_html)
        html_thread.start()
    start_time = time.time()
    # 当主线程退出的时候,子线程kill掉
    print("last time: {}".format(time.time() - start_time))



#根据上面进行变形后的程序

#以模拟简单的爬取文章列表页在获取详情页作一示例
import time
import threading

#设置引用的方式
detail_url_list = [] #作用:获取文章的列表页并获取文章详情页的url
# (该列表(或全局或全局变量)可以定义在.py文件中,直接from  模块 import  xx (xx.py)--> xx.全局变量)
#from chaper11 import variables  不推荐:from chapter11.variables import detail_url_list
# detail_url_list = variables.detail_url_list

#这种方式是通过引用变量参数的方式进行通信,足够灵活
def get_detail_html(detail_url_list): #传入引用,较灵活的方法
    #爬取文章详情页
    while True:
        # global detail_url_list(去掉全局变量)
        if len(detail_url_list):
            url = detail_url_list.pop()
            # for url in detail_url_list:
            print("get detail html started")
            time.sleep(2)
            print("get detail html end")

def get_detail_url(detail_url_list): #传入引用,较灵活的方法
    # global detail_url_list  (去掉全局变量)
    #爬取文章列表页
    while True:
        print("get url started")
        time.sleep(4)
        for i in range(20):
            detail_url_list.append("http://projectstedu.com/{id}".format(id=i))
        print("get detail url end")



if __name__=="__main__":
    thread_detail_url = threading.Thread(target=get_detail_url,args=(detail_url_list,)) #线程1
    thread_detail_url.start()
    for i in range(10):
        html_thread = threading.Thread(target=get_detail_html,args=(detail_url_list,))
        html_thread.start()
    start_time = time.time()
    # 当主线程退出的时候,子线程kill掉
    print("last time: {}".format(time.time() - start_time))

3、线程间的通信方式–通过Queue模块进行线程间同步

#!/usr/bin/evn python3
# --*-- coding: utf-8 --*--

#1、线程间的通信方式--通过queue的方式进行线程间同步(推荐)
# 线程间需要通信,使用全局变量需要加锁。
# 使用queue模块,可在线程间进行通信,并保证了线程安全。


#以模拟简单的爬取文章列表页在获取详情页作一示例
# queue是线程安全,不加锁,效率高,因为queue用了python中的deque() 双端队列,而deque()则是线程安全的,在字节码的级别上就已经达到了线程安全
from queue import Queue
import time
import threading

#设置引用的方式
detail_url_list = [] #作用:获取文章的列表页并获取文章详情页的url
# (该列表(或全局或全局变量)可以定义在.py文件中,直接from  模块 import  xx (xx.py)--> xx.全局变量)
#from chaper11 import variables  不推荐:from chapter11.variables import detail_url_list
# detail_url_list = variables.detail_url_list

#这种方式是通过引用变量参数的方式进行通信,足够灵活
def get_detail_html(queue): #传入引用,较灵活的方法
    #爬取文章详情页
    while True:
        url = queue.get()
        # for url in detail_url_list:
        print("get detail html started")
        time.sleep(2)
        print("get detail html end")


def get_detail_url(queue): #传入引用,较灵活的方法
    # global detail_url_list  (去掉全局变量)
    #爬取文章列表页
    while True:
        print("get url started")
        time.sleep(4)
        for i in range(20):
            queue.put("http://projectstedu.com/{id}".format(id=i)) #阻塞等待有空闲空间为止(put,参数block默认为True,阻塞状态,可以设置timeout)
        print("get detail url end")



if __name__=="__main__":
    detail_url_queue = Queue(maxsize=1000)
    thread_detail_url = threading.Thread(target=get_detail_url,args=(detail_url_list,)) #线程1
    thread_detail_url.start()
    for i in range(10):
        html_thread = threading.Thread(target=get_detail_html,args=(detail_url_list,))
        html_thread.start()

    # detail_url_queue.task_done()  调用task_done()函数join()函数才会退出,停止退出的作用
    # detail_url_queue.join()  阻塞等待

    start_time = time.time()
    # 当主线程退出的时候,子线程kill掉
    print("last time: {}".format(time.time() - start_time))
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/188613.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 深入浅出理解卷积运算

    深入浅出理解卷积运算提起卷积运算相信大家都不陌生 这是一种很常见的运算 我们在学习 信号与系统 时就一直在和卷积打交道 在后来的一些课程中也有卷积运算的身影 比如 自动控制原理现代部分 中的卷积定理等 在学习 信号与系统 时我们知道了卷积的定义 对于两个函数 f x f x f x 和 g x g x g x 他们的卷积 f g n f g n f g n 的公式如下 连续形式 f nbsp g n f g n d mathrm f mathrm g n int infty

    2025年8月27日
    4
  • MODIS数据火点提取方法

    MODIS数据火点提取方法MODIS数据火点提取【数据准备】所需数据:MODIS02数据注意下载1KM的数据(因为需要用到红外波段,而红外波段的空间分辨率较低)网站:https://ladsweb.modaps.eosdis.nasa.gov/search/imageViewer这里我们需要用的是Terra数据,点击SelectaSensor-MODIS:Terra,选择MOD021KM。

    2022年5月20日
    40
  • 试题库管理系统–数据库设计

    试题库管理系统–数据库设计一、概要设计1.1背景和意义目前,许多高校绝大多数课程还采用考教统一的模式来完成教学过程,这种传统的考试模式在教学到实施考试的过程带有很大的主观随意性和不规范性。另外随着各高校近年来学生规模的扩大,教学任务日益繁重,教师的工作量相应的不断增加。迫切需要计算机辅助教学系统来打破这种传统的教学模式,减轻教师的工作负担,提高教学质量。因此,本文研究设计了一个试题库管理系统,来解决和缓解高校课程

    2022年6月16日
    96
  • idea快捷键整理代码_idea中快捷键

    idea快捷键整理代码_idea中快捷键IDEA常用快捷键

    2022年10月12日
    3
  • CUDA安装教程(超详细)

    CUDA安装教程(超详细)目录前言cuda的下载及安装cuda版本CUDAtoolkitDownloadcuda安装cuDNN下载及安装cuDNN下载cuDNN配置参考自前言windows10版本安装CUDA,首先需要下载两个安装包CUDAtoolkit(toolkit就是指工具包) cuDNN注:cuDNN是用于配置深度学习使用官方教程CUDA:InstallationGuideWindows::CUDAToolkitDocumentatio

    2022年5月27日
    605
  • 在安装twincat plc时,出现 there are some files marked for deletion on next reboot.please reboot first then

    在安装twincat plc时,出现 there are some files marked for deletion on next reboot.please reboot first then

    2022年2月1日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号