目录
一、线程创建:
二、线程数据共享:
三、线程锁
四、线程调度
五、线程通信
六、定时线程
七、生产者与消费者
八、客户端与服务器数据交互
1、服务器:
2、客户端一
3、客户端二
import threading
import time
def run():
print('子线程%s启动' % (threading.current_thread().name))
# 实现线程功能
print('打印')
time.sleep(1)
print('子线程%s结束' % (threading.current_thread().name))
if __name__ == '__main__':
# 任何进程默认就会启动一个线程,称为主线程,主线程可以启动新的子线程
# current_thread():返回当前线程的实例
print('主线程%s启动' % (threading.current_thread().name))
# 创建子线程
t = threading.Thread(target=run, name='runthread')
t.start()
# 等待线程结束
t.join()
print('主线程%s结束' % (threading.current_thread().name))
#多进程和多线程最大的不同在于:多进程中,同一个变量,各自有一份拷贝在每个进程中,互不影响。多线程中,所有变量都由所有线程共享。所以任何一个变量都可以被任意一个线程修改。因此线程之间最大的危险在于同时修改一个变量容易把内容改乱了。
import threading
import time
n = 100
def run():
global n
n = n + 20
print('run:', n)
def fun():
global n
n = n / 10
print('fun:', n)
if __name__ == '__main__':
# 创建子线程
t = threading.Thread(target=run, name='runthread')
t.start()
t.join()
k = threading.Thread(target=fun, name='funthread')
k.start()
#作用:为每一个线程绑定一个数据库链接
import threading
import time
num = 0
# 创建一个全局的threadLocal对象
# 每个线程有独立的存储空间
# 每个线程对threadLocal对象都可以读写,但是互不影响
local = threading.local()
#list = [num, num]
def run(x, n):
x = x + n
x = x - n
def fun(n):
# 每个线程都有一个local.x,就是线程的局部变量
local.x = num
for i in range(100000):
run(local.x, n)
print('%s--%d' % (threading.current_thread().name, local.x))
if __name__ == '__main__':
# 创建子线程
t = threading.Thread(target=fun, args=(6,))
t2 = threading.Thread(target=fun, args=(9,))
t.start()
t2.start()
t.join()
t2.join()
print('num = ', num)
#调度两个线程之间的执行顺序
import threading, time
# 线程条件变量
cond = threading.Condition()
def run1():
with cond:
for i in range(0, 10, 2):
print(threading.current_thread().name, i)
time.sleep(1)
# 运行一次然后等待run2信息
cond.wait()
cond.notify()
def run2():
with cond:
for i in range(1, 10, 2):
print(threading.current_thread().name, i)
time.sleep(1)
# 给run1发送信息
cond.notify()
# 等待
cond.wait()
threading.Thread(target=run1).start()
threading.Thread(target=run2).start()
import threading, time
def fun():
# 事件对象
event = threading.Event()
def run():
for i in range(5):
# 阻塞,等待事件的触发
event.wait()
# 重置
event.clear()
print('what happen ...%d' % i)
t = threading.Thread(target=run).start()
return event
e = fun()
# 触发事件
for i in range(5):
e.set()
time.sleep(1)
import threading
def run():
print("sunck is a bad man")
#延时执行线程
t = threading.Timer(5,run)
t.start()
t.join()
print("父线程结束")
#4个生产者在生产数据 3个消费者将生产的数据从队列中取出
import threading, time, queue, random
# 生产者
def product(id, q):
while True:
num = random.randint(0, 10000)
q.put(num)
print('生产者%d生产了%d数据放入了队列' % (id, num))
time.sleep(3)
# 任务完成
q.task_done()
# 消费者
def customer(id, q):
while True:
item = q.get()
if item is None:
break
print('消费者%d消费了%d数据' % (id, item))
time.sleep(2)
# 任务完成
q.task_done()
if __name__ == '__main__':
# 消息队列
q = queue.Queue()
# 启动生产者 4
for i in range(4):
threading.Thread(target=product, args=(i, q)).start()
# 启动消费者 3
for i in range(3):
threading.Thread(target=customer, args=(i, q)).start()
import socket
import threading
#创建一个socket
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定IP和端口
server.bind(('192.168.1.103',8080))
#监听
server.listen(5)
print('服务器启动成功......')
# print(str(clientSocket),clientAddress)
def run(ck):
data = clientSocket.recv(1024)
print('收到数据:' + data.decode('utf-8'))
#sendData = input("输入返回给客户端的数据")
clientSocket.send("hello,this is server".encode('utf-8'))
while True:
# 等待链接
clientSocket, clientAddress = server.accept()
#print("%s--%s链接成功"%(str(clientSocket),clientAddress))
t = threading.Thread(target=run,args=(clientSocket,))
t.start()
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('192.168.1.103',9876))
count = 0
while True:
count += 1
data = input('请输入给服务器发送的数据')
client.send(data.encode('utf-8'))
info = client.recv(1024)
print('服务器说:', info.decode('utf-8'))
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('192.168.1.103', 8080))
count = 0
while True:
count += 1
data = input('请输入给服务器发送的数据')
client.send(data.encode('utf-8'))
info = client.recv(1024)
print('服务器说:', info.decode('utf-8'))