python 模块间传值,python中通过什么语句导入模块

  python 模块间传值,python中通过什么语句导入模块

  创建队列对象。

  导入队列

  myqueue=队列。队列(maxsize=10)

  排队。队列类是队列的同步实现。队列长度可以是无限的,也可以是有限的。队列长度可以通过Queue构造函数的可选参数maxsize来设置。如果maxsize小于1,则队列长度是无限的。

  将一个值放入队列。

  myqueue.put(10)

  调用queue对象的put()方法在队列末尾插入一个项目。Put()有两个参数,第一项是必需的,是插入项的值;第二个块是可选参数,默认为1。如果队列当前为空,块为1,put()方法会使调用线程暂停,直到数据单元为空。如果block为0,put方法将抛出一个完整的异常。

  从队列中取出一个值。

  myqueue.get()

  调用queue对象的get()方法从队列头删除和返回一个项目。可选参数为block,默认值为True。如果队列为空,block为True,get()会使调用线程暂停,直到有一个项目可用。如果队列为空并且block为False,那么队列将抛出一个空异常。python queue模块有三种队列:

  1.python队列模块的FIFO队列是FIFO。

  2.LIFO类似于堆。也就是先入后出。

  3.另一个是优先级队列级别越低,它越先出来。

  这三个队列有三个构造函数:

  1、班级排队。队列(最大大小)FIFO

  2、班级排队。后进先出队列(最大大小)

  3.班级队列。优先级队列(maxsize)

  介绍本包中的常用方法:

  Queue.qsize()返回队列的大小。

  如果队列为空,Queue.empty()返回True,否则返回False。

  如果队列已满,Queue.full()返回True,否则返回False。

  Queue.full对应于maxsize大小。

  Queue.get([block[,timeout]])获取队列,超时等待时间

  Queue.get_nowait()等效于Queue.get(False)

  非阻塞Queue.put(item)写队列,超时等待时间

  Queue.put_nowait(item)等效于Queue.put(item,False)

  Queue.task_done()在一个任务完成后,Queue.task_done()函数向任务已经完成的队列发送一个信号。

  Queue.join()实际上意味着在执行其他操作之前要等到队列为空。

  附上一个例子:

  #编码:utf-8

  导入队列

  导入线程

  导入时间

  随机导入

  Q=队列。Queue(0) #当有多个线程共享某些东西时,可以使用它。

  工人数量=3

  类MyThread(线程。线程):

  def __init__(自身,输入,工作类型):

  自我。_jobq=输入

  自我。_work_type=工作类型

  threading.Thread.__init__(self)

  定义运行(自身):

  虽然正确:

  如果自我。_jobq.qsize() 0:

  自我。_process_job(自身。_jobq.get(),self。_工作类型)

  否则:中断

  def _process_job(自身,作业,工作类型):

  doJob(职务,工作类型)

  定义doJob(作业,工作类型):

  time.sleep(random.random() * 3)

  打印“正在做”,工作,“工作类型”,工作类型

  if __name__==__main__ :

  打印“开始…”

  对于I in范围(工人数量* 2):

  将(I) #放入任务队列。

  打印“作业qsize:”,q.qsize()

  对于x in范围(NUM_WORKERS):

  MyThread(q,x)。开始()

  线程安全队列:在线程中,访问一些全局变量并锁定它们是一个频繁的过程。如果你想在队列中存储一些数据,Python有一个内置的线程安全模块,叫做队列模块。Python中的队列模块提供了同步和线程安全的队列类,包括FIFO队列和LifoQueue。这些队列都实现了锁原语(可以理解为原子操作,即要么什么都不做,要么什么都做),可以直接用于多线程。您可以使用队列来实现线程间的同步。相关功能如下:

  初始化队列(最大大小):创建一个先进先出的队列qsize():返回队列的大小empty():判断队列是否为空。完整():判断队列是否满了。get():从队列中取最后一个数据put():将一个数据放到队列中。使用生产者与消费者模式多线程下载表情包:从lxml导入线程导入请求从URL lib导入etree导入请求从队列导入OSI导入引用队列类生成器(线程).thread):headers={ User-Agent : Mozilla/5.0(Windows NT 10.0;win 64x 64)apple WebKit/537.36(KHTML,像壁虎一样)Chrome/62。0 .3202 .94 Safari/537.36 } def _ _ init _ _(self,page_queue,img_queue,*args,**kwargs): super(Producer,self).__init__(*args,* * kwargs)self。page _ queue=page _ queue自身。img _ queue=img _ queue def run(self):while True:if self。page _ queue。empty():break URL=self。page _ queue。get()self。parse _ page(URL)def parse _ page(self,url): response=requests.get(url,headers=self。标题)文本=响应。text html=etree .HTML(文本)imgs=HTML。XPath(//div[@ class= page-content text-center ]//a//img )for imgs:if img。get( class )= gif :continue img _ URL=img。XPath(.//@ data-original )[0]后缀=OS。路径。split ext(img _ URL)[1]alt=img。XPath(.//@alt)[0] alt=re.sub(r[,/\\ ],,alt) img_name=alt后缀self.img_queue.put((img_url,img_name))类消费者(线程Thread): def __init__(self,page_queue,img_queue,*args,**kwargs): super(Consumer,self)。__init__(*args,* * kwargs)self。page _ queue=page _ queue自身。img _ queue=img _ queue def run(self):while True:if self。img _ queue。empty():如果self。page _ queue。empty():返回img=self。img _ queue。get(block=True)URL,filename=img请求。URL检索(URL,图像/文件名)打印(文件名下载完成!)def main():page _ Queue=Queue(100)img _ Queue=Queue(500)for x in range(1,101):URL=http://www.doutula.com/photo/list/?页面=% d % x page _ queue。put(URL)for x in range(5):t=Producer(page _ queue,img _ queue)t . start()for x in range(5):t=Consumer(page _ queue,img _ queue)t . start()if _ _ name _ _= _ _ main _ _ :main()GIL全局解释器锁:Python自带的解释器是CPython。解释器解释器的多线程实际上是一个假的多线程(在多核中央处理器中,只能利用一核,不能利用多核)。同一时刻只有一个线程在执行,为了保证同一时刻只有一个线程在执行,在解释器解释器中有一个东西叫做GIL(全球解译锁)、叫做全局解释器锁。这个解释器锁是有必要的。因为解释器解释器的内存管理不是线程安全的。当然除了解释器解释器,还有其他的解释器,有些解释器是没有GIL锁的,见下面:

  Jython:用爪哇实现的计算机编程语言解释器。不存在GIL锁。更多详情请见:https://zh。维基百科。org/wiki/jythonionpython:用。网实现的计算机编程语言解释器。不存在GIL锁。更多详情请见:https://zh。维基百科。org/wiki/ironpythonpyy:用计算机编程语言实现的计算机编程语言解释器。存在GIL锁。更多详情请见:https://zh。维基百科。org/wiki/PyPy

  GIL虽然是一个假的多线程。但是在处理一些超正析象管(图片Orthicon)操作(比如文件读写和网络请求)还是可以在很大程度上提高效率的。在超正析象管(图片Orthicon)操作上建议使用多线程提高效率。在一些中央处理器计算操作上不建议使用多线程,而建议使用多进程。多线程下载百思不得姐段子作业:导入请求来自什么是导入长队导入线程来自队列导入队列导入战斗支援车类BSSpider(线程. thread):headers={ User-Agent : Mozilla/5.0(Windows NT 10.0;win 64x 64)apple WebKit/537.36(KHTML,像壁虎一样)Chrome/62。0 .3202 .94 Safari/537.36 } def _ _ init _ _(self,page_queue,joke_queue,*args,**kwargs): super(BSSpider,self).__init__(*args,* * kwargs)self。base _ domain= http://www。布德杰。自己来吧。page _ queue=page _ queue自身。joke _ queue=joke _ queue def run(self):while True:if self。page _ queue。empty():break URL=self。page _ queue。get()响应=请求。get(URL,headers=self。标题)文本=响应。text html=etree .HTML(文本)descs=HTML。用于描述的XPath(//div[@ class= j-r-list-c-desc ]):笑话=desc.xpath( .//text()) joke=\n .加入(笑话)。strip()link=self。基本域desc。XPath(.//a/@ href )[0]self。笑话_排队。放((笑话,链接))打印(=*30 第%s页下载完成!%url.split(/)[-1] =*30)类BSWriter(线程. thread):headers={ User-Agent : Mozilla/5.0(Windows NT 10.0;win 64x 64)apple WebKit/537.36(KHTML,喜欢壁虎)Chrome/62。0 .3202 .94 Safari/537.36 } def _ _ init _ _(self,joke_queue,writer,gLock,*args,**kwargs): super(BSWriter,self).__init__(*args,* * kwargs)self。玩笑队列=玩笑队列自我。作家=作家自我。lock=gLock def run(self):while True:try:joke _ info=self。笑话_排队。get(time out=40)笑话,link=joke _ info self。锁定。获得()自我。作家。writerow((笑话,链接))self.lock.release() print(保存一条)除了:break def main():page _ Queue=Queue(10)joke _ Queue=Queue(500)gLock=threading .Lock() fp=open(bsbdj.csv , a ,newline= ,encoding= utf-8 )writer=CSV。作家(FP)作家。范围(1,11)中x的writerow(( content , link ):URL= http://www .布德杰。com/text/% d % x page _ queue。范围(5)中x的put(URL):t=bs spider(page _ queue,joke _ queue)范围(5)中x的t . start():t=BSS

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: