码迷,mamicode.com
首页 > 编程语言 > 详细

多线程,代码示例

时间:2020-02-08 19:39:40      阅读:89      评论:0      收藏:0      [点我收藏+]

标签:future   ==   proc   相互   data   相同   nec   main   用户输入   

一。threading模块介绍

与multiprocess模块在使用层面上的接口相似。

 

二。开启线程的两种方式

from threading import Thread
def func(name):
    print("my name is %s"%name)
if __name__ == "__main__":
    t = Thread(target=func,args="张三")
    t.start()

from threading import Thread
import time
class Sayhi(Thread):
    def __init__(self,name):
        super().__init__()
        self.name=name
    def run(self):
        time.sleep(2)
        print(%s say hello % self.name)
if __name__ == __main__:
    t = Sayhi(egon)
    t.start()
    print(主线程)

 

 

三。在一个进程下,开启多线程和多进程的区别

技术图片
from threading import Thread
from multiprocessing import Process
import os

def work():
    print(hello)

if __name__ == __main__:
    #在主进程下开启线程
    t=Thread(target=work)
    t.start()
    print(主线程)
    ‘‘‘
    打印结果:
    hello
    主线程
    ‘‘‘

    #在主进程下开启子进程
    p=Process(target=work)
    p.start()
    print(主进程)
    ‘‘‘
    打印结果:
    主进程
    hello
    ‘‘‘
线程的开启速度更快
技术图片
from threading import Thread
from multiprocessing import Process
import os

def work():
    print(hello,os.getpid())

if __name__ == __main__:
    #part1:在主进程下开启多个线程,每个线程都跟主进程的pid一样
    t1=Thread(target=work)
    t2=Thread(target=work)
    t1.start()
    t2.start()
    print(主线程pid,os.getpid())

    #part2:开多个进程,每个进程都有不同的pid
    p1=Process(target=work)
    p2=Process(target=work)
    p1.start()
    p2.start()
    print(主进程pid,os.getpid())
主进程下开启多线程(与主进程pid相同),开启多进程(与主进程pid不同)

 

技术图片
from  threading import Thread
from multiprocessing import Process
import os
def work():
    global n
    n=0

if __name__ == __main__:
    # n=100
    # p=Process(target=work)
    # p.start()
    # p.join()
    # print(‘主‘,n) #毫无疑问子进程p已经将自己的全局的n改成了0,但改的仅仅是它自己的,查看父进程的n仍然为100


    n=1
    t=Thread(target=work)
    t.start()
    t.join()
    print(,n) #查看结果为0,因为同一进程内的线程之间共享进程内的数据
同一进程内的线程共享该进程的数据,进程间数据相互独立

 

 

四。练习

练习一:

技术图片
#_*_coding:utf-8_*_
#!/usr/bin/env python
import multiprocessing
import threading

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((127.0.0.1,8080))
s.listen(5)

def action(conn):
    while True:
        data=conn.recv(1024)
        print(data)
        conn.send(data.upper())

if __name__ == __main__:

    while True:
        conn,addr=s.accept()


        p=threading.Thread(target=action,args=(conn,))
        p.start()
多线程并发的socket服务端
技术图片
#_*_coding:utf-8_*_
#!/usr/bin/env python


import socket

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((127.0.0.1,8080))

while True:
    msg=input(>>: ).strip()
    if not msg:continue

    s.send(msg.encode(utf-8))
    data=s.recv(1024)
    print(data)
客户端

 

练习二:三个任务,一个接收用户输入,一个将用户输入的内容格式化成大写,一个将格式化后的结果存入文件

技术图片
from threading import Thread
msg_l=[]
format_l=[]
def talk():
    while True:
        msg=input(>>: ).strip()
        if not msg:continue
        msg_l.append(msg)

def format_msg():
    while True:
        if msg_l:
            res=msg_l.pop()
            format_l.append(res.upper())

def save():
    while True:
        if format_l:
            with open(db.txt,a,encoding=utf-8) as f:
                res=format_l.pop()
                f.write(%s\n %res)

if __name__ == __main__:
    t1=Thread(target=talk)
    t2=Thread(target=format_msg)
    t3=Thread(target=save)
    t1.start()
    t2.start()
    t3.start()
View Code

 

五。线程相关的其他方法

Thread实例对象的方法:

 

threading模块提供的一些方法:

 

六。守护线程

七。Python GIL

八。同步锁

九。死锁现象与递归锁

十。信号量Semaphore

十一。Event

十二。条件Condition(了解)

十三。定时器

十四。线程queue

十五。python标准模块--concurrent.futures

多线程,代码示例

标签:future   ==   proc   相互   data   相同   nec   main   用户输入   

原文地址:https://www.cnblogs.com/yizhixiaowenzi/p/12284376.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!