鱼C论坛

 找回密码
 立即注册
查看: 1271|回复: 1

[已解决]python多线程问题)

[复制链接]
发表于 2021-1-18 21:29:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
下面的代码只不断地运行一个线程(哪个先start就一直不停的运行哪个),不进行线程间的切换,不知道是哪里出了问题
(应该是两个线程相互交替运行)

import threading
import time

ticket = 4

lock = threading.Lock()
def sell_ticket():
    global ticket
    while True:
        # 上锁
        lock.acquire()
        if ticket > 0:
            time.sleep(10)
            ticket -= 1
            print('{}卖了一张票,还剩{}张票'.format(threading.current_thread().name, ticket))
            lock.release()
        else:
            lock.release()
            print('票已售完')
            break


t1 = threading.Thread(target=sell_ticket, name='线程1')
t2 = threading.Thread(target=sell_ticket, name='线程2')

t2.start()
t1.start()


最佳答案
2021-1-19 08:53:54
两个线程都启动了,但while几乎会一直锁着变量,只有非常短暂的间隙会释放,所以其他进程抢不到。你把票写100张,去掉sleep就看出来了,其他进程也能抢到内存。只是抢到的机会少。
另外买票这个动作本该就是只买1张,然后进程结束的,用while一直挂着不太合适。

  1. from threading import Thread, Lock
  2. import time

  3. n = 100

  4. def task():
  5.     global n
  6.     mutex.acquire()
  7.     temp = n
  8.     time.sleep(0.1)
  9.     n = temp - 1
  10.     print('购买成功,剩余%d张电影票' % n)
  11.     mutex.release()


  12. if __name__ == '__main__':
  13.     mutex = Lock()
  14.     t_l = []
  15.     for i in range(10):
  16.         t = Thread(target=task)
  17.         t_l.append(t)
  18.         t.start()
  19.     for t in t_l:
  20.         t.join()
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-19 08:53:54 | 显示全部楼层    本楼为最佳答案   
两个线程都启动了,但while几乎会一直锁着变量,只有非常短暂的间隙会释放,所以其他进程抢不到。你把票写100张,去掉sleep就看出来了,其他进程也能抢到内存。只是抢到的机会少。
另外买票这个动作本该就是只买1张,然后进程结束的,用while一直挂着不太合适。

  1. from threading import Thread, Lock
  2. import time

  3. n = 100

  4. def task():
  5.     global n
  6.     mutex.acquire()
  7.     temp = n
  8.     time.sleep(0.1)
  9.     n = temp - 1
  10.     print('购买成功,剩余%d张电影票' % n)
  11.     mutex.release()


  12. if __name__ == '__main__':
  13.     mutex = Lock()
  14.     t_l = []
  15.     for i in range(10):
  16.         t = Thread(target=task)
  17.         t_l.append(t)
  18.         t.start()
  19.     for t in t_l:
  20.         t.join()
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 06:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表