<small id='wHpSe'></small><noframes id='wHpSe'>

<legend id='wHpSe'><style id='wHpSe'><dir id='wHpSe'><q id='wHpSe'></q></dir></style></legend>
    <bdo id='wHpSe'></bdo><ul id='wHpSe'></ul>

  1. <tfoot id='wHpSe'></tfoot>
  2. <i id='wHpSe'><tr id='wHpSe'><dt id='wHpSe'><q id='wHpSe'><span id='wHpSe'><b id='wHpSe'><form id='wHpSe'><ins id='wHpSe'></ins><ul id='wHpSe'></ul><sub id='wHpSe'></sub></form><legend id='wHpSe'></legend><bdo id='wHpSe'><pre id='wHpSe'><center id='wHpSe'></center></pre></bdo></b><th id='wHpSe'></th></span></q></dt></tr></i><div id='wHpSe'><tfoot id='wHpSe'></tfoot><dl id='wHpSe'><fieldset id='wHpSe'></fieldset></dl></div>

      Python多进程同步Lock、Semaphore、Event实例

      时间:2023-12-16

      • <tfoot id='aUME8'></tfoot>

          • <bdo id='aUME8'></bdo><ul id='aUME8'></ul>
              <tbody id='aUME8'></tbody>

                <small id='aUME8'></small><noframes id='aUME8'>

                <i id='aUME8'><tr id='aUME8'><dt id='aUME8'><q id='aUME8'><span id='aUME8'><b id='aUME8'><form id='aUME8'><ins id='aUME8'></ins><ul id='aUME8'></ul><sub id='aUME8'></sub></form><legend id='aUME8'></legend><bdo id='aUME8'><pre id='aUME8'><center id='aUME8'></center></pre></bdo></b><th id='aUME8'></th></span></q></dt></tr></i><div id='aUME8'><tfoot id='aUME8'></tfoot><dl id='aUME8'><fieldset id='aUME8'></fieldset></dl></div>

                <legend id='aUME8'><style id='aUME8'><dir id='aUME8'><q id='aUME8'></q></dir></style></legend>

                下面就为您详细讲解Python多进程同步的Lock、Semaphore、Event实例的使用攻略。

                前言

                在Python中,允许我们在多个进程之间进行同步的原语,常见的有锁(Lock)、信号量(Semaphore)和事件(Event)等。这些同步机制都可以帮助我们实现在多进程环境下的协同工作。

                Lock

                Lock是一种基本的同步原语,可以帮助我们处理多个进程之间的访问冲突。当进行共享资源访问时,我们可以使用锁来避免多个进程同时对同一资源进行修改。在python中,Lock的使用方式是在需要同步的代码块前后加上with lock语句,这样就可以使用锁了。

                示例说明

                以下是一个使用Lock的示例代码,其中我们开启了五个不同的进程,但是对共享变量number的修改是通过使用锁来实现的,这样保证了对number的修改不会出现互斥问题:

                import multiprocessing
                
                def increment_number(lock, number):
                    for i in range(10000):
                        with lock:
                            number.value += 1
                
                if __name__ == '__main__':
                    number = multiprocessing.Value('i', 0)
                    lock = multiprocessing.Lock()
                    processes = [multiprocessing.Process(target=increment_number, args=(lock, number)) for _ in range(5)]
                    for p in processes:
                        p.start()
                    for p in processes:
                        p.join()
                    print(number.value)
                

                Semaphore

                Semaphore是一种更加通用的同步原语,其原理与Lock类似,但是可以支持多个进程同时访问。Semaphore可以帮助我们控制并发访问数量,限制对共享资源同时进行访问的进程数。

                示例说明

                以下是一个使用Semaphore的示例代码,我们使用Semaphore来限制对共享变量workers的访问数量,限制了同时访问workers的进程数量不超过2个:

                import multiprocessing
                
                def worker(semaphore, worker_id):
                    with semaphore:
                        print(f'Worker {worker_id} is working...')
                        time.sleep(1)
                        print(f'Worker {worker_id} finished.')
                
                if __name__ == '__main__':
                    semaphore = multiprocessing.Semaphore(2)
                    processes = [multiprocessing.Process(target=worker, args=(semaphore, i)) for i in range(5)]
                    for p in processes:
                        p.start()
                    for p in processes:
                        p.join()
                

                Event

                Event用于进程之间的协同工作,其中一些进程可以等待在事件上,而另一些进程可以触发事件。Event对象可以用于不同进程间通信,并支持进程的同步与互斥。

                示例说明

                以下是一个使用Event的示例代码,我们开启了两个不同的进程,其中一个进程不停地进行数数,另一个进程则在触发事件后终止数数的操作:

                import multiprocessing
                
                def counting(event):
                    i = 0
                    while not event.is_set():
                        i += 1
                        print(i)
                        time.sleep(0.5)
                    print('Counting finished')
                
                if __name__ == '__main__':
                    event = multiprocessing.Event()
                    counting_process = multiprocessing.Process(target=counting, args=(event,))
                    counting_process.start()
                    time.sleep(3)
                    event.set()
                    counting_process.join()
                

                总结

                在Python中,我们可以使用同步原语来保证多进程之间的协同工作。本文介绍了三种同步原语:Lock、Semaphore和Event的使用方法及示例。需要注意的是,在使用时需要特别谨慎,谨防死锁或者数据竞争的问题。

                上一篇:Python 使用threading+Queue实现线程池示例 下一篇:Python使用多进程运行含有任意个参数的函数

                相关文章

                  <legend id='m7WcC'><style id='m7WcC'><dir id='m7WcC'><q id='m7WcC'></q></dir></style></legend>

                  • <bdo id='m7WcC'></bdo><ul id='m7WcC'></ul>
                  1. <tfoot id='m7WcC'></tfoot>
                    <i id='m7WcC'><tr id='m7WcC'><dt id='m7WcC'><q id='m7WcC'><span id='m7WcC'><b id='m7WcC'><form id='m7WcC'><ins id='m7WcC'></ins><ul id='m7WcC'></ul><sub id='m7WcC'></sub></form><legend id='m7WcC'></legend><bdo id='m7WcC'><pre id='m7WcC'><center id='m7WcC'></center></pre></bdo></b><th id='m7WcC'></th></span></q></dt></tr></i><div id='m7WcC'><tfoot id='m7WcC'></tfoot><dl id='m7WcC'><fieldset id='m7WcC'></fieldset></dl></div>

                    <small id='m7WcC'></small><noframes id='m7WcC'>