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))
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • sql server 2008 r2产品密钥(附二)

    微软官方发布的MicrosoftSQLServer2008R2简体中文完整版。基于SQLServer2008提供可靠高效的智能数据平台构建而成,SQLServer2008R2提供了大量新改进,可帮助您的组织满怀信心地调整规模、提高IT效率并实现管理完善的自助BI。此版本中包含应用程序和多服务器管理、复杂事件处理、主数据服务及最终用户报告等方面的新功能和增强功能。…

  • (OS 10038)在一个非套接字上尝试了一个操作 的解决办法[通俗易懂]

    在SVN的机器上,系统盘,剩余空间不足1G,经查看,是C:\ProgramFiles(x86)\ApacheSoftwareFoundation\Apache2.2\logs里面存在了很多(每天一个)很大(600M或6G的)日志文件,error-2015-07-31.logs删除后,不几天就会重新生成。打开error-2015-07-31.logs文件,发现,如下信息【(OS10

  • java messagedigest_JAVA MessageDigest(MD5加密等)

    java messagedigest_JAVA MessageDigest(MD5加密等)转自http://blog.csdn.net/hudashi/article/details/8394158一、概述java.security.MessageDigest类用于为应用程序提供信息摘要算法的功能,如MD5或SHA算法。简单点说就是用于生成散列码。信息摘要是安全的单向哈希函数,它接收任意大小的数据,输出固定长度的哈希值。关于信息摘要和散列码请参照《数字证书简介》MessageD…

  • Linux offsetof宏定义

    Linux offsetof宏定义#include<stddef.h>size_t offsetof(type, member) #define offsetof(TYPE, MEMBER)        \           ((size_t)&((TYPE*)0)->MEMBER) Themacroreturntheoffsetofthe…

  • ZigBee协议栈解析

    ZigBee协议栈解析ZigBee技术是物联网领域最常用的无线技术之一,如果我们要做基于ZigBee技术的物联网应用,最好对ZigBee协议栈有一个基本的了解。这篇文章对ZigBee协议栈做一个简单明了的介绍。概述本文准备介绍的ZigBee协议栈是ZigBee2007,也是目前业界最常用的标准版本,对于ZigBee协议栈的演进历程,可以参加《5分钟了解Zigbee的前世今生》。Zi…

  • java中用正则表达式截取字符串_正则表达式除去指定字符串

    java中用正则表达式截取字符串_正则表达式除去指定字符串正则表达式字符意义:. 符合任一字符/d 符合0~9任一个数字字符/D 符合0~9以外的字符/s 符合/t、/n、/x0B、/f、/r等空格符/w 符合a~z、A~Z、0~9等字符,也就是数字或是字母都符合/W 符合a~z、A~Z、0~9等之外的字符,也就是除数字与字母外都符合举例来说,如果有一字符串abcdebc

    2022年10月28日

发表回复

您的电子邮箱地址不会被公开。

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