多線程 和 Queue

Queue

The Queue module implements multi-producer, multi-consumer queues.

def worker():
    while True: 
        item = q.get() 
        do_work(item)
        q.task_done() 
        # Indicate that a formerly enqueued task is complete. Used by queue consumer threads. 
        # For each get() used to fetch a task, \
        # a subsequent call to task_done() tells the queue that the processing on the task is complete.

q = Queue()
    
for i in range(num_worker_threads): 
    t = Thread(target=worker) 
    t.daemon = True 
    t.start()

for item in source(): 
    q.put(item)

q.join() #Blocks until all items in the queue have been gotten and processed.

Threading 多線程

使用Threading模块创建线程,直接从threading.Thread继承,然后重写init方法和run方法:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import threading
import time
exitFlag = 0
class myThread (threading.Thread): #继承父类threading.Thread 
    def __init__(self, threadID, name, counter): 
        threading.Thread.__init__(self) 
        self.threadID = threadID 
        self.name = name 
        self.counter = counter 

    def run(self): #把要执行的代码写到run函数里面 线程在创建后会直接运行run函数  
        print "Starting " + self.name 
        print_time(self.name, self.counter, 5) 
        print "Exiting " + self.name

    def print_time(threadName, delay, counter): 
        while counter: 
            if exitFlag: 
                thread.exit() 
            time.sleep(delay) 
            print "%s: %s" % (threadName, time.ctime(time.time())) 
            counter -= 1

# 创建新线程
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
# 开启线程
thread1.start()
thread2.start()
print "Exiting Main Thread"

多線程和隊列結合

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import threading
import time
import Queue

SHARE_Q = Queue.Queue() #构造一个不限制大小的的队列
_WORKER_THREAD_NUM = 3 #设置线程个数

class MyThread(threading.Thread) : 
    def __init__(self, func) : 
        super(MyThread, self).__init__() 
        self.func = func 

    def run(self) : 
        self.func()

    def worker() :
        global SHARE_Q 
        while not SHARE_Q.empty(): 
            item = SHARE_Q.get() #获得任务 
            print "Processing : ", item 
            time.sleep(1)

def main() : 
    global SHARE_Q 
    threads = [] 
    for task in xrange(5) : #向队列中放入任务 
        SHARE_Q.put(task) 
        for i in xrange(_WORKER_THREAD_NUM) : 
            thread = MyThread(worker) 
            thread.start() 
            threads.append(thread) 
        for thread in threads : 
            thread.join()

if __name__ == '__main__': 
      main()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容