python进程和线程中的join方法

Python进程和线程的join方法简单说明:

1.Python中的进程join方法

在Python多进程编程中,join方法主要用于进程之间的同步。
这允许进程等待其他进程完成执行。
通过调用目标进程的join方法,主进程可以阻塞自己,直到目标进程结束。
这可确保代码在多进程环境中按特定顺序运行。

2.Python中的线程Join方法

在线程编程中,join方法用于阻止主线程执行,直到指定线程执行完成。
当您在一个线程中使用另一个线程的join方法时,主线程会等待该线程完成其任务,然后再继续。
这可以同步线程的执行并确保特定任务按预期顺序执行。

详细解释:

在Python中,无论是进程还是线程,join方法的核心作用就是等待。
它们的主要区别在于使用的环境和对象类型。

在多进程编程中,由于进程是系统资源分配的基本单位,因此进程之间的通信和同步相对复杂。
您可以使用Join方法来确保主进程等待其他进程按预期完成。
这对于需要按特定顺序执行的多进程任务非常有用。

在线程编程中,线程是CPU调度的基本单位。
由于线程共享同一进程的内存空间,因此它们之间的同步尤为重要。
使用线程的join方法可以确保主线程等待特定线程完成其任务后再继续,从而控制程序流程。
这对于多线程任务至关重要,尤其是那些需要顺序执行的任务。

需要注意的是,无论是进程还是线程的join方法,都要谨慎使用,避免不必要的阻塞或者死锁。
明智地使用join方法可以大大提高程序的执行效率和稳定性。
同时,还应注意理解和使用并发编程中的其他同步机制如锁、条件变量等,以应对更复杂的并发场景。

Python多进程系列之Queue类

使用多进程时,最好不要使用共享资源。
普通的全局变量不能被子进程共享。
只有使用多处理组件构建的数据结构才能共享。

Queue是一个类,用于创建队列以在进程之间共享资源。
使用Queue可以实现多个进程之间传输数据的功能。
但Queue只能在Process类中使用,不能在Pool类中使用。

1.基本介绍1.1构造方法

Queue([maxsize])

maxsize是队列中允许的最大元素数量,如果省略,将是一个无限队列

1.2构造方法实例put():用于向队列中插入数据。
该方法有2个可选参数:阻塞和超时。
如果阻塞值为True(默认值)并且超时值大于0,则此方法将阻塞超时,直到队列中没有剩余空间。
超时时会抛出Queue.Full异常。
如果锁定值为False并且队列已满,则会立即抛出Queue.Full

get():从队列中获取项目并删除该项目,类似于pop()列表方法。
该方法还有2个可选参数:blocked和timeout。
如果阻塞值为True(默认)并且超时值大于0,则在超时时间内不会抛出Queue.Empty异常。
如果锁定值为False并且队列中有可用项目,则返回该项目。
如果阻塞值为False且队列为空,则会抛出Queue.Empty异常。
通过将阻塞值设置为True或将所有参数留空,您可以防止队列为空时引发异常。

put_nowait():与put(blcoked=False)相同

get_nowait():与get(blcoked=False)相同

empty():确定如果队列为空。
但是,当队列为空并返回True时,此方法并不可靠,例如当put()方法返回True时,将插入新数据。

full():判断队列是否已满。
这种方法也是不可靠的。
例如,当返回True时,get()方法将删除数据。

qsize():返回队列中当前的项目数,同样不可靠,原因与empty()和full()相同

2.使用示例frommultiprocessingimportQueue,Processamountsimporttimeimportrandomdefwrite(q):print(f'写入过程:{os.getpid()}')forvalueinrange(5):print(f'put{value}toqueue......')q.put(value)time.sleep(random.random())defread(q):print(f'Processtoread:{os.getpid()}')whileTrue:value=q.get(True)print(f'get{value}fromqueue......')if__name__=='__main__':q=Queue()pw=Process(target=write,args=(q,))pr=Process(target=read,args=(q,))pw.start()pr.start()pw.join()pr.terminate()

结果:

写入过程:2856put0toqueue...Processtoread:17560get0fromqueue...put1toqueue...get1fromqueue...put2toqueue...get2fromqueue...put3toqueue....get3fromqueue...put4toqueue...get4fromqueue...

Python多进程系列之Value类和Array类

多处理中Value和Array的实现原理是在共享内存中创建ctypes()对象,以达到数据共享的目的。
两者的实现方法类似,只是使用了不同的ctypes数据类型。

1.Value1.1构造方法Value(typecode_or_type:Union[str,Type[_CData]],*args:Any,lock:Union[bool,_LockLike]=...)

code_or_type:定义ctypes()对象的类型,可以传递Typecode或CType,具体数据对照表见1.2

args:传递给构造函数的参数typecode_or_type

lock:默认为true,创建互斥锁以限制对Value的访问。
如果传递了锁,它将用于同步。
如果值为False,则Value实例将不受锁保护,这意味着此时它不是进程安全的。
1.2支持的数据类型TypecodeCTypePythonTypeMinimumsizeinbytes'b'signedcharint1'B'unsignedcharint1'u'wchar_tUnicodecharacter2'h'signedshortint2'H'unsignedshortint2'i'signedint2'I(大写i)'unsignedintint2'l(如果是小写)l)'signedlongint4'L'unsignedlongint4'q'signedlonglongint8'Q'unsignedlongint8'f'float构造方法float4'd'doublefloat82.Array2.1Array(typecode_or_type:Union[str,Type[_CData]],size_or_initializer:Union[int,序列[任意]],*,锁:Union[布尔,_LockLike]=...)

typecode_or_type:定义ctypes()对象的类型,可以传入Typecode或CType,具体数据对照表见2.2

size_or_initializer:如果它的值为整数,则该值决定数组的长度,并且数组被初始化为零。
否则,该值是用于初始化字符串的序列,其长度决定了字符串的长度。

*:传递给构造函数的参数typecode_or_type

lock:默认为True,创建互斥锁来限制对Value的访问。
如果传递了锁,它将用于同步。
如果值为False,则Value实例将不受锁保护,这意味着此时它不是进程安全的。

3使用示例frommultiprocessingimportProcess,Value,Arraydeff(n,a):n.value=3.14a[0]=5if__name__=='__main__':num=Value('d',0.0)arr=Array.('me',range(10))p=Process(target=f,args=(num,arr))p.start()p.join()print(num.value)print(arr[:])

结果:

3.14[5,1,2,3,4,5,6,7,8,9]