• 网络编程(day5)


    http://www.cnblogs.com/yuanchenqi/articles/6755717.html

    import threading
    from time import ctime,sleep
    import time
    
    def Music(name):
    
            print ("Begin listening to {name}. {time}".format(name=name,time=ctime()))
            sleep(3)
            print(threading.activeCount())
            print(threading.enumerate())
            print("end listening {time}".format(time=ctime()))
    
    
    def Blog(title):
    
            print ("Begin recording the {title}. {time}".format(title=title,time=ctime()))
            sleep(5)
            print('end recording {time}'.format(time=ctime()))
    
    
    threads = []
    
    
    t1 = threading.Thread(target=Music,args=('FILL ME',),name="sub_thread")
    t2 = threading.Thread(target=Blog,args=('',))
    
    threads.append(t1)
    threads.append(t2)
    
    if __name__ == '__main__':
    
        t1.setDaemon(True)  # daemon:监听,主进程一直等,只等t2
    
        for t in threads:
    
            t.start()
    
        print ("all over %s" %ctime())

    GIL影响是同一时刻一个进程中只能有一个线程在执行,对于cpu密集型的没有意义,但是对于IO密集型的有意义 

     同步锁

    import time
    import threading
    
    def subNum():
    
        global num #在每个线程中都获取这个全局变量
        # num-=1
        print("ok")
        lock.acquire()#加锁开始
        temp=num
        time.sleep(0.1)
        num =temp-1  # 对此公共变量进行-1操作
        lock.release()#加锁结束只对中间圈的起作用,而join是对整个都是串行的,ok不会全部打印出来
    
    num = 100  #设定一个共享变量
    thread_list = []
    
    lock=threading.Lock()#不允许其他线程来切,必须执行完才能切,是为是保护数据,
    
    for i in range(100):
        t = threading.Thread(target=subNum)
        t.start()
        thread_list.append(t)
        # t.join()
    
    for t in thread_list: #等待所有线程执行完毕
        t.join()
    
    print('Result: ', num)

    递归锁

    import threading
    import time
    
    #递归锁,rlock,只要涉及到公共数据,数据安全的时候,是唯一的安全机制,他内部有个计数器1,2
    #同步锁不能acquire多次,建议多用递归锁
    
    # mutexA = threading.Lock()
    # mutexB = threading.Lock()
    
    Rlock=threading.RLock()
    
    class MyThread(threading.Thread):
    
        def __init__(self):
            threading.Thread.__init__(self)
    
        def run(self):
    
            self.fun1()
            self.fun2()
    
        def fun1(self):
    
            Rlock.acquire()  # 如果锁被占用,则阻塞在这里,等待锁的释放
    
            print ("I am %s , get res: %s---%s" %(self.name, "ResA",time.time()))
    
            Rlock.acquire()  # count=2
            print ("I am %s , get res: %s---%s" %(self.name, "ResB",time.time()))
            Rlock.release()   #count-1
    
            Rlock.release()   #count-1 =0
    
    
        def fun2(self):
            Rlock.acquire()  # count=1
            print ("I am %s , get res: %s---%s" %(self.name, "ResB",time.time()))
            time.sleep(0.2)
    
            Rlock.acquire()  # count=2
            print ("I am %s , get res: %s---%s" %(self.name, "ResA",time.time()))
            Rlock.release()
    
            Rlock.release()   # count=0
    
    
    if __name__ == "__main__":
    
        print("start---------------------------%s"%time.time())
    
        for i in range(0, 10):
    
            my_thread = MyThread()
            my_thread.start()

    event对像 

    #EVent就是线程间通信用的
    
    import threading
    import time
    import logging
    
    logging.basicConfig(level=logging.DEBUG, format='(%(threadName)-10s) %(message)s',)
    
    
    def worker(event):
        logging.debug('Waiting for redis ready...')
    
        while not event.isSet():
            logging.debug("wait.......")
            event.wait(3)   # if flag=False阻塞,等待flag=true继续执行
    
    
        logging.debug('redis ready, and connect to redis server and do some work [%s]', time.ctime())
        time.sleep(1)
    
    def main():
    
        readis_ready = threading.Event()  #  flag=False
        t1 = threading.Thread(target=worker, args=(readis_ready,), name='t1')
        t1.start()
    
        t2 = threading.Thread(target=worker, args=(readis_ready,), name='t2')
        t2.start()
    
        logging.debug('first of all, check redis server, make sure it is OK, and then trigger the redis ready event')
    
        time.sleep(6) # simulate the check progress
        readis_ready.set()  # flag=Ture
    
    
    if __name__=="__main__":
        main()

    进程

    # from multiprocessing import Process
    #
    #
    # import time
    #
    #
    # def f(name):
    #
    #     print('hello', name,time.ctime())
    #     time.sleep(1)
    #
    # if __name__ == '__main__':
    #     p_list=[]
    #
    #     for i in range(3):
    #         p = Process(target=f, args=('alvin:%s'%i,))
    #         p_list.append(p)
    #         p.start()
    #
    #
    #     # for i in p_list:
    #     #     p.join()
    #
    #     print('end')
    from multiprocessing import Process
    import os
    import time
    
    def info(name):
    
        print("name:",name)
        print('parent process:', os.getppid())
        print('process id:', os.getpid())
        print("------------------")
    
    
    def foo(name):
    
        info(name)
        time.sleep(50)
    
    if __name__ == '__main__':
    
        info('main process line')
    
    
        p1 = Process(target=info, args=('alvin',))
        p2 = Process(target=foo, args=('egon',))
        p1.start()
        p2.start()
    
        p1.join()
        p2.join()
    
        print("ending")
        time.sleep(100)
    
        

    协程

      主要应用:还是在IO操作上,当你遇到IO操作,

      优点:1 就切换单线程,不存在切换,2,不存在锁的概念

    greenlt框架

    gevent模块实现协程

  • 相关阅读:
    java实现向有序数组中插入一个元素
    java实现向有序数组中插入一个元素
    java实现向有序数组中插入一个元素
    java实现字符逆序输出
    java实现字符逆序输出
    java实现字符逆序输出
    将博客搬至CSDN
    sql server链接查询
    sql server模糊查询、分组
    sql server简单查询
  • 原文地址:https://www.cnblogs.com/wanchenxi/p/7837133.html
Copyright © 2020-2023  润新知